2012-10-25 13 views
7

हाइबरनेट में एक सबक्वायरी कैसे लिखें जिसमें एकाधिक सबक्वायरी हो रही है। उदाहरणहाइबरनेट सबक्वायरी पृथकक्रिटिया

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

के लिए मुझे पता है कि हम DetachedCriteria के माध्यम से लिख सकते हैं लेकिन couldnot किसी भी उदाहरण है जहाँ मैं कई सबक्वेरी का उपयोग कर सकते हैं।

उत्तर

8

यहाँ एक उदाहरण है:

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

कई सबक्वेरी के लिए, आप 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

मैं इस तरह से – DebD

+0

आवाज कर रही है की कोशिश की तरह उसने ऐसा नहीं किया काम। यदि आप कुछ और विवरण प्रदान कर सकते हैं, शायद आपके द्वारा किए गए कोड, शायद हम और अधिक मदद कर सकते हैं। –

+0

ठीक है, आपका उदाहरण वास्तव में उसके कोड को दोहराना नहीं है। उसके पास एक सबक्वायरी के अंदर एक सबक्वायरी है लेकिन आपका सिर्फ एक OR है। – AHungerArtist

संबंधित मुद्दे