我试图在现有的GORM条件中添加一个子句,以进行一些额外的过滤。
我的域中有Organisation
拥有的各种对象。例如,Product
。组织也可以拥有其他组织。我只希望属于特定User
的Organisation
能够查看属于该Organisation
或其任何Organisation
的子Organisation
的域对象。
我的应用程序中有很多地方需要查询Organisation
拥有的域对象。我想创建一个DetachedCriteria
实例,可以在需要过滤掉User
不允许看到的对象的任何地方通过应用程序重复使用。
我对模型进行了非规范化处理,以期使事情变得更轻松。插入新的Organisation
时,它将递归地将其自身添加到其上方每个hierarchyOrganisations
的Organisations
集合中。
class Organisation {
...
static hasMany = [hierarchyOrganisations: Organisation]
...
}
我要应用组织过滤
DetachedCriteria
的地方之一是Grails脚手架 Controller 的list
方法,因此我需要能够对最终结果集进行分页。以
Product
Controller 的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。
最佳答案
def organisationInstanceList = Organisation.createCriteria().list {
idEq(currentUserOrganisation.id)
hierarchyOrganisations{
//Eagerly fetch all children for the parent org
}
}
def children = organisationInstanceList?.first().hierarchyOrganisations
我可能简化了一些事情,但是以上内容应该给您
parent
组织和相应的children
组织。你还需要什么?添加到@Sergio的选项:
非规范化可能是不必要的。数据模型可以用作
class Organisation {
Organization parent
}
添加新组织后,只需将其映射到相应的父组织,即可自动创建层次结构。
为了得到, parent 的所有 child (分页)使用
def children = Organization.findAllByParent(currentUserOrganisation, [max: params.max, offset: params.offset])
关于hibernate - GORM条件查询过滤列表中的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686139/