hibernate - GORM条件查询过滤列表中的ID

标签 hibernate grails gorm criteria

我试图在现有的GORM条件中添加一个子句,以进行一些额外的过滤。

我的域中有Organisation拥有的各种对象。例如,Product。组织也可以拥有其他组织。我只希望属于特定UserOrganisation能够查看属于该Organisation或其任何Organisation的子Organisation的域对象。

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

我对模型进行了非规范化处理,以期使事情变得更轻松。插入新的Organisation时,它将递归地将其自身添加到其上方每个hierarchyOrganisationsOrganisations集合中。

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/

相关文章:

java - 持久化新元素时违反唯一索引或主键

grails - Gorm嵌套查询包含任何

java - 在遗留软件中混合编程式和声明式事务

grails - 将用户保留在Grails的Config.groovy列表中

grails - 从插件访问 'grailsApplication'

hibernate - 如何使用 Joda Time 查询 HQL (Hibernate) 中的日期?

mongodb - 使用Grails的MongoDB WildCard查询花费太多时间

grails - Grails-动态查找器派生日期查询GORM

java - 具有旧数据库架构和复合 FK 和 PK 的 Hibernate

java - Json 数组转 html 表 - JSTL