2013-03-21 3 views
7

エンティティの子のすべてが値のセットにあるプロパティを持つエンティティを返すJPQLクエリを作成しようとしています。 JPA Query - 値のセット内のプロパティを持つすべての子を持つ親を選択するJPQLクエリ

は私が持っているそれらの父親を選択したい...ここ

Hibernate query - How to select those parents that have ALL the children matching a value?

は、上記の質問から適応実用的な例である:それは、次の質問に似ていますが、複数の可能な値がある場合すべての子供たちは金髪か赤毛かです。ただ1つが黒い髪ならば、父親は選ばれません。

私はかなり仕事にそれらを期待していますが、試してみる価値はありませんでした...のような

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

または

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

を上記の質問に対する答えの様々な適応を試みました。これまでのところ唯一の事は...

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

を働いている私は本当にすべての行に対して、このようなカウントクエリを実行する必要がないことを好むだろうが、私はより良いメカニズムを見ていませんよ。私はこれを他の方法で単純なSQLで記述することはできませんが、私はそれほど驚くことではありません。これを達成するより効率的な方法はありますか?

答えて

3

あなたはコレクションプロパティのように見えるものよりJPQLパス式を使用しようとします。代わりに、次のように参加します:上記

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

Parentは、すべてのターゲット・エンティティは単一値haircolor性質を持つプロパティchildrenその大切なコレクションを持つエンティティであると仮定されます。 :hairColorCollectionは、クエリを実行する前にコレクションオブジェクトに設定する必要があるパラメータです。

+5

コレクションパラメータの追加が予定されていましたが、これは典型的な内部結合のみです。子のANYがコレクションに一致するエンティティを返します。ここでの問題は、親が返される前にすべての子を照合する必要があることです。 – nfdavenport

関連する問題