【问题标题】:Grails GORM query to match multiple associated objectsGrails GORM 查询以匹配多个关联对象
【发布时间】: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 将仅应用于单个语句。尝试不会有什么坏处 - 会让你知道会发生什么。

标签: hibernate grails associations grails-orm h2


【解决方案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

【讨论】:

  • 感谢您帮助澄清问题-应该帮助我找到解决方案:¬)
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多