2013-03-21 10 views
7

Ich versuche eine JPQL-Abfrage schreiben, um Entitäten zurückzugeben, wo alle untergeordneten Objekte dieser Entität eine Eigenschaft in einer Gruppe von Werten haben. Es ist ähnlich wie die folgende Frage, aber wo gibt es mehrere mögliche Werte:JPA-Abfrage - JPQL, um Eltern auszuwählen, die ALLE Kinder mit einer Eigenschaft in einem Satz von Werten haben

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

Hier ist ein praktisches Beispiel aus der obigen Frage angepasst ...

ich die Väter wählen wollen, die haben ALLE ihre Kinder, die entweder blond oder rothaarig sind. Wenn nur einer schwarzhaarig ist, wird der Vater nicht ausgewählt.

Ich habe verschiedene Anpassungen der Antwort auf die obige Frage versucht, wie ...

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

oder

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

nicht ganz jene an die Arbeit erwarten, aber einen Versuch wert. Bisher ist nur eine Sache gearbeitet hat ...

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

ich wirklich würde es vorziehen, nicht so eine Zählung Abfrage für jede Zeile in sich zu tragen, aber ich bin nicht einen besseren Mechanismus zu sehen. Das überrascht mich nicht völlig, da ich mir keine andere Möglichkeit vorstellen kann, dies in SQL zu schreiben, aber ich bin auch kein Guru. Gibt es einen effizienteren Weg, dies zu erreichen?

Antwort

3

Sie versuchen, JPQL-Pfadausdrücke über etwas zu verwenden, das wie eine Auflistungseigenschaft aussieht - das ist nicht möglich. Stattdessen tun ein wie folgt verbinden:

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

Oben Parent angenommen wird, ein Unternehmen mit einer Sammlung geschätzt Eigenschaft sein children von denen jeder Zieleinheit einen einzelnen Wert haircolor Eigenschaft hat. :hairColorCollection ist ein Parameter, der vor dem Ausführen der Abfrage auf ein Auflistungsobjekt festgelegt werden sollte.

+5

Das Hinzufügen des Collection-Parameters war geplant, aber das ist nur ein typischer innerer Join. Es würde Entitäten zurückgeben, bei denen ALLE der untergeordneten Elemente der Auflistung entsprechen. Das Problem hier ist, dass ALLE untergeordneten Elemente übereinstimmen müssen, bevor das übergeordnete Element zurückgegeben wird. – nfdavenport