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'

これは正しい結果をもたらすことはできません。なぜなら、1匹の動物が同時にクマと鳥とプーマになることはできないからです。

あなたが探しているのはこのようなものです:

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クエリ言語を使用する場合を除いて、それは不可能な場合があります。

于 2012-05-10T19:29:14.270 に答える