2012-10-25 16 views
7

Come scrivere una sottoquery in sospensione che ha più sottoquery. per esempioSospensione di subquery distaccataCriteria

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]')) 

So che possiamo scrivere attraverso DetachedCriteria ma couldnot trovare alcun esempio dove posso utilizzare più subquery.

risposta

8

Ecco un esempio:

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))); 

Per più subquery, è possibile utilizzare un operatore booleano come 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

Ho provato a fare questo modo – DebD

+0

suona come non ha fatto lavoro. Se puoi fornire ulteriori dettagli, forse il codice che hai provato, forse possiamo aiutarti di più. –

+0

Bene, il tuo esempio in realtà non replica il suo codice. Ha una sottoquery all'interno di una subquery ma la tua è solo una sala operatoria. – AHungerArtist