Я пытаюсь добавить пункт к существующим критериям GORM, чтобы выполнить дополнительную фильтрацию.
В моем домене есть различные объекты, принадлежащие Organisation
. Например, Product
. Организации также могут владеть другими организациями. Я хочу, чтобы только User
, принадлежащие определенному Organisation
, могли видеть объекты домена, принадлежащие этому Organisation
или любому из их Organisation
дочерних Organisation
.
В моем приложении есть несколько мест, где мне нужно запросить объекты домена, принадлежащие Organisation
s. Я хочу создать экземпляр DetachedCriteria
, который я могу повторно использовать в приложении везде, где мне нужно отфильтровать объекты, которые User
не должен видеть.
Я немного денормализовал свою модель, чтобы упростить задачу. Когда вставляется новый Organisation
, он рекурсивно добавляет себя в коллекцию hierarchyOrganisations
каждого из Organisations
над ним.
class Organisation {
...
static hasMany = [hierarchyOrganisations: Organisation]
...
}
Одно из мест, где я хочу применить фильтрацию организации DetachedCriteria
, находится в методе list
контроллера скаффолдинга Grails, поэтому мне нужно иметь возможность разбить окончательный набор результатов на страницы.
Используя в качестве примера метод списка контроллера Product
, я сейчас делаю что-то вроде этого:
def hierarchyCriteria = new DetachedCriteria(Organisation).build {
eq('id', currentUserOrganisation.id)
}
def productInstanceList = Product.createCriteria().list {
inList('parentOrganisation.id', hierarchyCriteria.list().each { organisation ->
organisation.hierarchyOrganisations.collect { it.id }
})
}
... который работает, но я не думаю, что он будет масштабироваться. Я буду обращаться к базе данных, чтобы вернуть коллекцию hierarchyOrganisations
, затем перебирать их в приложении, чтобы получить идентификатор, а затем снова запрашивать, чтобы вернуть окончательный отфильтрованный список организаций.
Если бы я использовал SQL, я мог бы использовать соединение или внутренний выбор, но я не могу правильно понять синтаксис, переводя это в критерии GORM dsl.