我正在尝试向现有的 GORM 标准添加一个子句以进行一些额外的过滤。
我的域中有各种对象,这些对象由Organisation
. 例如,Product
。组织也可以拥有其他组织。我只希望User
属于某个特定的 sOrganisation
能够看到属于那个Organisation
或任何他们Organisation
的子Organisation
s 的域对象。
我的应用程序中有很多地方需要查询Organisation
s 拥有的域对象。我想创建一个DetachedCriteria
实例,我可以在需要过滤掉User
不应被允许看到的对象的任何地方通过应用程序重用该实例。
我已经对我的模型进行了一些非规范化,希望能让事情变得更容易。当一个新Organisation
的被插入时,它会递归地将自己添加到上面hierarchyOrganisations
每个它的集合中Organisations
。
class Organisation {
...
static hasMany = [hierarchyOrganisations: Organisation]
...
}
我想应用组织过滤的地方之一DetachedCriteria
是在 Grails 的脚手架控制器的list
方法中,因此我需要能够对最终结果集进行分页。
以Product
控制器的 list 方法为例,我目前正在做这样的事情 -
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
,然后在应用程序中迭代它们以提取 id,然后再次查询以带回最终过滤的组织列表。
如果我使用 SQL,我可以使用连接或内部选择,但我似乎无法正确地将其转换为 GORM 标准 dsl 的语法。