Grails GORM 查询以匹配多个关联对象

Posted

技术标签:

【中文标题】Grails GORM 查询以匹配多个关联对象【英文标题】:Grails GORM query to match multiple associated objects 【发布时间】:2012-05-10 07:24:28 【问题描述】:

我无法确定一个 GORM 查询以匹配对象上的多个关联:

class Zoo 
    String name
    static hasMany = [animals:Animal]

    static namedQueries = 
        // SEARCH1 match any of a list of animals
        searchOr  searchAnimals ->
            or 
                searchAnimals.each  name ->
                    animals 
                        eq('name', name)
                    
                
            
        

        // SEARCH2 match ALL of a list of animals
        searchAnd  searchAnimals ->
            and 
                searchAnimals.each  name ->
                    animals 
                        eq('name', name)
                    
                
            
        
    


class Animal 
    String name

SEARCH1 很乐意将动物园与动物列表中的任何一个进行匹配,但是应该如何编写 SEARCH2 以获取在提供的列表中包含所有动物的动物园?

【问题讨论】:

在 searchAnimals.each 下移动 and 会发生什么 @jonaldomo 我认为当前的and 无论如何都是隐含的,因此没有必要。将其移至searchAnimals.each ,隐含的and 仍然存在,而新的and 将仅应用于单个语句。尝试不会有什么坏处 - 会让你知道会发生什么。 【参考方案1】:

我不了解 GORM,也不知道完整的解决方案,但我认为当前的 SEARCH2 查询存在什么问题以及可能有什么帮助。当前的 searchOr 是这样的:

WHERE ANIMAL.NAME = 'bear' 
   OR ANIMAL.NAME = 'bird' 
   OR ANIMAL.NAME = 'puma'

这会很好用。 searchAnd 是这样的:

WHERE ANIMAL.NAME = 'bear' 
  AND ANIMAL.NAME = 'bird' 
  AND ANIMAL.NAME = 'puma'

这不能给出正确的结果,因为任何单一的动物不可能同时是熊、鸟和美洲狮。

你正在寻找的是这样的:

WHERE EXISTS (SELECT FROM ANIMAL A WHERE A.ZOO = Z.ID AND A.NAME = 'bear') 
  AND EXISTS (SELECT FROM ANIMAL A WHERE A.ZOO = Z.ID AND A.NAME = 'bird')
  AND EXISTS (SELECT FROM ANIMAL A WHERE A.ZOO = Z.ID AND A.NAME = 'puma')

但是我对 GORM 的了解还不够,无法以这种方式制定查询。从我读到的detached criteria 中有一个exists 方法。但也许这是不可能的,除非使用Hibernate Query Language。

【讨论】:

感谢您帮助澄清问题-应该帮助我找到解决方案:¬)

以上是关于Grails GORM 查询以匹配多个关联对象的主要内容,如果未能解决你的问题,请参考以下文章

跨两个数据源的 Grails GORM 域关联

GORM 关联查询用法

Grails NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联

Grails 命名查询 - 按关联查找

[go-每日一库]golang-gorm实现关联查询

GORM关联查询