0

hql クエリを作成するためのアドバイスが必要です。

状況:Nodesの設定可能な量を に割り当てることができるのセットがありますFlags。これを行うには、次のクラス/テーブルがあります。

クラス:

class Node {
  String name
}

class Flag {
  String name
}

class NodeHasFlag {
  Node node
  Flag flag
  boolean value
}

いくつかのサンプル データを含む結果のテーブル:

Node
id, name
1,  'a'
2,  'b'
3,  'c'
...

Flag
id, name
1,  'visible'
2,  'special'
...

NodeHasFlag
node_id, flag_id, value
1,       1,       true      // node 'a' is visible
2,       1,       false     // node 'b' is not visible
2,       2,       true      // node 'b' is special
3,       1,       false     // node 'c' is not visible
...

フラグに基づいてノードのリストを取得するには、hql クエリが必要です。

visibleLike:およびであるすべてのノードを教えてくださいspecial

visibleまたは:未定義の値を持つすべてのノードを教えてください(テーブルspecialにエントリがありません)NodeHasFlag

単一のフラグをチェックするのは簡単ですが、複数のフラグを同時にチェックすると問題が発生します。

私はGrailsとGormを使用していますが、問題は標準のJava Hibernateでも同じだと思います

4

2 に答える 2

3

これはサブクエリで解決できると思います。最初の例は次のようになります。2 番目の例では、LEFT JOIN と OR IS NULL 制限が必要です。

    select n from Node n
        where n.id in 
            (select n2.id from Node n2 
                join n2.flags f2 
                where f2.visible = :visibleValue)
       and n.id in
            (select n3.id from Node n3
                join n3.flags f3
                where f3.special = :specialValue)
于 2013-05-01T19:57:40.830 に答える