0

我无法找出一个 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 以获取在提供的列表中包含所有动物的动物园?

4

1 回答 1

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 的了解还不够,无法以这种方式制定查询。从我读到的有一种分离标准exists的方法。但也许这是不可能的,除非使用Hibernate Query Language

于 2012-05-10T19:29:14.270 回答