2012-10-25 9 views
7

Jak napisać podzapytanie w hibernacji, które ma wiele podzapytań. na przykład:Podział hibernacji odłączonyCriteria

select * from project_dtls where project_id in 
    (select project_id from project_users where user_id = 
    (select user_id from user_dtls where email='[email protected]')) 

Wiem, że możemy pisać przez DetachedCriteria, ale nie można znaleźć żadnego przykładu, w którym można użyć wielu podkwerend.

Odpowiedz

8

Oto przykład:

DetachedCriteria exampleSubquery = DetachedCriteria.forClass(MyPersistedObject.class) 
    .setProjection(Property.forName("id")) 
    // plus any other criteria... 
    ; 

Criteria criteria = getSession().createCriteria(ARelatedPersistedObject.class) 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .add(Subqueries.propertyIn("myPersistedObjectId", exampleSubquery))); 

Dla wielu podzapytania, można użyć operatora logiczną jak Restrictions.or():

DetachedCriteria anotherSubquery = DetachedCriteria.forClass(MyPersistedObject.class) 
    .setProjection(Property.forName("id")) 
    // plus any other criteria... 
    ; 

Criteria criteria = getSession().createCriteria(ARelatedPersistedObject.class) 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .add(Restrictions.or(
     Subqueries.propertyIn("myPersistedObjectId", exampleSubquery), 
     Subqueries.propertyIn("myPersistedObjectId", anotherSubquery))); 
+0

Próbowałem robić ten sposób – DebD

+0

brzmi jak to nie praca. Jeśli możesz podać trochę więcej szczegółów, być może kod, który wypróbowałeś, może pomożemy Ci więcej. –

+0

Cóż, twój przykład faktycznie nie powiela jego kodu. Ma podzapytanie wewnątrz podzapytania, ale twoje jest tylko OR. – AHungerArtist