9

そのエンティティのすべての子が値のセットにあるプロパティを持つエンティティを返す JPQL クエリを作成しようとしています。次の質問に似ていますが、複数の可能な値があります。

Hibernateクエリ - すべての子が値に一致する親を選択する方法は?

上記の質問から適用された実際の例を次に示します...

私は、すべての子供が金髪か赤毛である父親を選びたいと思っています。一人でも黒髪なら父親は選ばれない。

上記の質問に対する答えをさまざまに適応させてみました...

select p from parent where all(parent.children.haircolor) IN ('blonde','redhead')

また

select p from parent where parent.children.haircolor ALL IN ('blonde','redhead')

それらがうまくいくとは思っていませんでしたが、試してみる価値があります。これまでのところ、うまくいったことは1つだけです...

select p from parent 
where 0 = (select count(c) from p.children c 
              where c.haircolor NOT IN ('blonde','redhead')
          )

行ごとにこのようなカウント クエリを実行する必要はありませんが、より良いメカニズムは見当たりません。単純な SQL でこれを記述する他の方法をまったく考えられないので、これはまったく驚くことではありませんが、私もその分野の第一人者ではありません。これを達成するためのより効率的な方法はありますか?

4

2 に答える 2

6

コレクションプロパティのように見えるものに対してJPQLパス式を使用しようとしますが、それはできません。代わりに、次のように結合します。

SELECT p FROM Parent p JOIN p.children c WHERE c.haircolor IN :hairColorCollection

上記は、すべてのターゲットエンティティが単一の値のプロパティParentを持つコレクション値のプロパティを持つエンティティであると想定されています。クエリを実行する前にコレクションオブジェクトに設定する必要があるパラメータです。childrenhaircolor:hairColorCollection

于 2013-03-21T04:55:02.353 に答える