0

我正在尝试向现有的 GORM 标准添加一个子句以进行一些额外的过滤。

我的域中有各种对象,这些对象由Organisation. 例如,Product。组织也可以拥有其他组织。我只希望User属于某个特定的 sOrganisation能够看到属于那个Organisation或任何他们Organisation的子Organisations 的域对象。

我的应用程序中有很多地方需要查询Organisations 拥有的域对象。我想创建一个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 的语法。

4

2 回答 2

2
def organisationInstanceList = Organisation.createCriteria().list {
    idEq(currentUserOrganisation.id)
    hierarchyOrganisations{
      //Eagerly fetch all children for the parent org
    }
}

def children = organisationInstanceList?.first().hierarchyOrganisations

我可能过于简化了事情,但上面应该给你parentorg 和相应的childrenorgs。你还需要什么?

添加到@Sergio 的选项:

非规范化可能是不必要的。数据模型可用作

class Organisation {
    Organization parent
}

添加新组织时,只需将其映射到相应的父级,就会自动创建层次结构。

为了从父级获取所有子级(分页),请使用

def children = Organization.findAllByParent(currentUserOrganisation, [max: params.max, offset: params.offset])
于 2013-05-22T13:38:43.867 回答
1

我刚刚结束了使用一些 SQL 来增加标准。

通过向sqlRestriction我的标准 dsl 添加一个块,我能够添加一个子选择来应用我需要的过滤

我仍然有兴趣找出仅使用 grails hibernate 标准 dsl 是否可行。

于 2013-05-29T06:50:41.583 回答