我正在尝试在现有的GORM标准中添加一个子句来进行额外的过滤。
我的域中有各种由Organisation
拥有的对象。例如,Product
。组织也可以拥有其他组织。我只希望属于特定User
的{{1}}个人能够看到属于该Organisation
或其Organisation
个孩子{{1}的域对象}}第
我的应用程序中有很多地方需要查询Organisation
所拥有的域对象。我想创建一个Organisation
实例,无论我需要过滤掉Organisation
不允许看到的对象,我都可以在应用程序中重复使用该实例。
我已经对我的模型进行了非规范化,希望能让事情变得更轻松。当插入新的DetachedCriteria
时,它会递归地将其自身添加到其上方User
的每个Organisation
集合中。
hierarchyOrganisations
我想要应用组织过滤Organisations
的地方之一是在Grails的脚手架控制器的class Organisation {
...
static hasMany = [hierarchyOrganisations: Organisation]
...
}
方法中,所以我需要能够对最终的结果集进行分页。
以DetachedCriteria
控制器列表方法为例,我现在正在做这样的事情 -
list
......哪个有效,但我认为它不会扩展。我将访问数据库以恢复Product
的集合,然后在应用程序中迭代它们以提取id,然后再次查询以返回最终筛选的组织列表。
如果我使用SQL,我可以使用连接或内部选择,但我似乎无法正确地将其转换为GORM标准dsl。
答案 0 :(得分:2)
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
}
添加新组织后,只需将其映射到相应的父组织,即可自动创建层次结构。
为了获取来自父母的所有孩子(分页),请使用
def children = Organization.findAllByParent(currentUserOrganisation, [max: params.max, offset: params.offset])
答案 1 :(得分:1)
我最后使用了一些SQL来扩充标准。
通过在我的条件dsl中添加sqlRestriction
块,我可以添加子选择以应用我需要的过滤
我仍然有兴趣只使用grails hibernate标准来查明是否可行。