2011-08-09 24 views
8

Bir SQL deyiminde yürütmek istediğim bir Hazırda bulunma kriteri çağrısı var. Yapmaya çalıştığım şey, çocukları bir dış birleştirme kullanarak yüklerken, bir değer aralığında (SQL IN yan tümcesi) bir Özelliği olan Çocukları olan Ana'nın örneklerini seçmektir. İşte ben bugüne kadar ne var: Burada Çocuklarda kısıtlamalarla hazırda bekleyen ölçütler

Criteria c = session.createCriteria(Parent.class); 

c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN) 
      .setFetchMode("c", FetchMode.JOIN) 
      .add(Restrictions.in("c.property", properties)); 

c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

return c.list(); 

bazı örnek veriler var:

Parent 
Parent ID 
A 
B 
C 

Children 
Child ID Parent ID property 
...   A   0 
...   A   2 
...   A   7 
...   B   1 
...   C   1 
...   C   2 
...   C   3 

Ne yapmak isteyen çocuklardan biri eşit bir özelliğe sahipse ebeveynler ve TÜM çocuklarını dönmek olduğunu benim parametre (ler) bağlamak. Özelliklerin {2} içeren bir dizi olduğunu varsayalım. Bu durumda, çağrı A ve C ebeveynlerini iade edecek, ancak çocuk koleksiyonları sadece 2. unsuru içerecektir. Veli [Çocuklar]:

A [2] & C [2]

İstediğim geçerli:

A [0, 2, 7] & C [1, 2 3]

Bu bir hata değilse, bozuk bir semantik gibi görünüyor. A.getChildren() veya C.getChildren() 'ı nasıl çağırdığımı ve 1 kaydı iade etmenin nasıl doğru olacağını düşünmüyorum - bu bir projeksiyon değil. Yani Ben varsayılan getirme seçeneğini kullanmak için sorguyu güçlendirmek, eğer albiet sorgularının bir sayıda, uygun çocuk koleksiyonları döndürür:

c.createAlias("children", "c").add(
     Restrictions.in("c.property", properties)); 

Bu bir hata mı? Değilse, istediğim sonuca nasıl ulaşabilirim?

cevap

1

getChildren() yalnızca alıcının/ayarlayıcının adıdır, sorgunuz nesnelerin nasıl dolduğunu belirler.

Ben ilk bölümü istediğini almaz

SELECT * FROM Parent 
INNER JOIN Child c ON ... 
WHERE c.property in (x,y,z) 

tükürür burada tahmin etmeye gidiyorum. Sonuncusu Bu sorguyu üreten değilse hile yapabilir uygun şekilde kriterlerini yeniden düzenleyerek

SELECT * FROM Parent 
WHERE ParentID IN (SELECT DISTINCT parentID FROM Child WHERE c.property in (x,y,z)) 

: Ne sen çiğ SQL bu yazıyormuş yapmak ister budur. (Ayrıca, her biri için hazırda bekletme nesnesini de yayınlayabilir misiniz?)

+1

Doğru, SQL kolay bir parçasıdır. Aradığım kriter kriterleri. ;) Ayrıca, unutmayın ki bu, çocuk varlıkları doldurmak için bir dış katılım gerektirecektir. –

+0

Ebeveyn ve tembelce çocukları yükleme 2. sorgu nedir? – dfb

+0

Evet, her bir üst kayıt için döndürülen bir çocuk sorgusu yürütülüyor, bu da kaçınmaya çalışıyorum. Bu aslında bir kusur olabilir gibi görünüyor, ama herkes bir geçici çözüm varsa merak ediyorum: https://hibernate.onjira.com/browse/HHH-3524 –

0

Ölçütleri alt sınıfla başlatacağım. Tüm çocuklarla bir liste alacaksınız ve sonra her çocuk için tekrarlayabiliyor ve ebeveynleri alabiliyorsunuz.

2
 Criteria c = session.createCriteria(Parent.class); 

    c.createAlias("children", "children"); 
    c.add(Restrictions.in("children.property", properties)); 

    c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

    return c.list(); 
0

Bu, işin etrafından yapılabilir.

Criteria c1 = session.createCriteria(Child.class); 
c1.add(Restrictions.in("property", properties)); 
c1.setProjection(Projections.distinct(Projections.property("parentId"))); 
List<Integer> parentIds = c1.list(); 

Criteria c2 = session.createCriteria(Parent.class); 
c2.createAlias("children", "children"); 
c2.add(Restrictions.in("id", parentIds)); 
return c2.list(); 
İlgili konular