GORM条件查询过滤其中id为列表

时间:2013-05-22 07:41:35

标签: hibernate grails gorm criteria

我正在尝试在现有的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。

2 个答案:

答案 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标准来查明是否可行。