【问题标题】:GORM criteria query filtering where id in listGORM 条件查询过滤 where id in list
【发布时间】:2013-05-22 07:41:34
【问题描述】:

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

我的域中有各种对象,这些对象归 Organisation 所有。例如,Product。组织也可以拥有其他组织。我只希望属于特定OrganisationUsers 能够看到属于该Organisation 或其Organisation 的任何孩子Organisations 的域对象。

我的应用程序中有很多地方需要查询Organisations 拥有的域对象。我想创建一个 DetachedCriteria 实例,只要我需要过滤掉不应允许 User 看到的对象,我就可以在应用程序中重复使用该实例。

我已经对我的模型进行了一些非规范化,希望能让事情变得更容易。当插入一个新的Organisation 时,它会递归地将自身添加到上面每个OrganisationshierarchyOrganisations 集合中。

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


    【解决方案1】:
    def organisationInstanceList = Organisation.createCriteria().list {
        idEq(currentUserOrganisation.id)
        hierarchyOrganisations{
          //Eagerly fetch all children for the parent org
        }
    }
    
    def children = organisationInstanceList?.first().hierarchyOrganisations
    

    我可能过于简单化了,但上面应该给你parent orgs 和相应的children orgs。你还需要什么?

    添加到@Sergio 的选项:

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

    class Organisation {
        Organization parent
    }
    

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

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

    def children = Organization.findAllByParent(currentUserOrganisation, [max: params.max, offset: params.offset])
    

    【讨论】:

    • 也许他想要孩子,需要给他们分页?
    • 添加了该选项(确实是一个更简单的选项)以及@SérgioMichels。 :)
    • 谢谢你们的回复。重新阅读我的问题,我意识到我并没有真正清楚地说明我的要求 - 我需要查询的不仅仅是层次结构,我需要能够查询我域中的任何对象并应用“组织过滤器” ' 以确保我的查询返回的每个域对象都属于我的层次结构或组织中的组织之一。我稍微改写了这个问题,并使用了与我的域不同的对象作为我需要应用过滤器的示例。
    【解决方案2】:

    我刚刚使用了一些 SQL 来扩充条件。

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2016-04-23
      • 2012-06-21
      • 2019-09-05
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多