2013-03-21 15 views
7

Tüm varlık öğelerinin bir değer kümesinde sahip olduğu öğelerin döndürülmesi için JPQL sorgusu yazmayı deniyorum. JPA Sorgu - Değerler kümesinde TÜM çocuklara sahip olan ebeveynleri olan ebeveynleri seçmek için JPQL

ben sahip olan babalar seçmek istediğiniz ... İşte

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

yukarıdaki soruya uyarlanan pratik bir örnektir: Aşağıdaki soruya benzer, ancak birden olası değerler olduğu yerde TÜM çocukları ya sarışın ya da kızıl olan. Sadece biri siyah saçlıysa baba seçilmez.

Oldukça işime bu beklemiyorduk ...

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

veya

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

yukarıdaki soru gibi cevap çeşitli uyarlamalar çalıştı, ama denemeye değer ettik. Şimdiye kadar tek bir şey

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

Gerçekten her satır için böyle bir sayım sorgusu çalıştırmak zorunda tercih ediyorum ... çalışmış HAS, ama daha iyi bir mekanizma görmüyorum. Bu beni tamamen şaşırtmadı çünkü bunu basit bir SQL'de yazmak için başka bir yol düşünemiyorum, ama ben de orada bir guru değilim. Bunu gerçekleştirmenin daha verimli bir yolu var mı?

cevap

3

JPQL yol ifadelerini bir koleksiyon özelliğine benzeyen üzerinden kullanmaya çalışırsınız - bunu yapamazsınız. Bunun yerine bir böyle katılmak yapın:

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

şeyden önce, Parent her hedef varlık tek değerli haircolor özelliği olan bir koleksiyon değerli mülk children ile bir varlık olarak kabul edilir. :hairColorCollection, sorguyu yürütmeden önce bir koleksiyon nesnesine ayarlanması gereken bir parametredir.

+5

Koleksiyon parametresinin eklenmesi planlandı, ancak bu yalnızca tipik bir iç birleştirmeyi gerçekleştiriyor. Çocuklardan HERHANGİ koleksiyonun eşleştiği yerlere geri dönecektir. Buradaki sorun, ebeveynlerin geri gönderilmesinden önce TÜM çocukların eşleşmesi gerekiyor. – nfdavenport

İlgili konular