【发布时间】:2013-05-22 07:41:34
【问题描述】:
我正在尝试向现有的 GORM 标准添加一个子句以进行一些额外的过滤。
我的域中有各种对象,这些对象归 Organisation 所有。例如,Product。组织也可以拥有其他组织。我只希望属于特定Organisation 的Users 能够看到属于该Organisation 或其Organisation 的任何孩子Organisations 的域对象。
我的应用程序中有很多地方需要查询Organisations 拥有的域对象。我想创建一个 DetachedCriteria 实例,只要我需要过滤掉不应允许 User 看到的对象,我就可以在应用程序中重复使用该实例。
我已经对我的模型进行了一些非规范化,希望能让事情变得更容易。当插入一个新的Organisation 时,它会递归地将自身添加到上面每个Organisations 的hierarchyOrganisations 集合中。
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。
【问题讨论】:
标签: hibernate grails grails-orm criteria