2010-05-21 19 views
7

यह सवाल बहुत this one के समान है लेकिन जवाब है कि सवाल का बहुत कम था के खिलाफ मैच के लिए क्वेरी।हाइबरनेट मापदंड सभी चाइल्ड संग्रह तत्वों

मैं बच्चे संस्थाओं का एक सेट के साथ एक माता पिता के वर्ग की है। बाल संस्थाएं एक स्ट्रिंग के लिए सिर्फ एक रैपर हैं और मूल इकाई में एक अलग तालिका में रहते हैं। मैं एक मानदंड पूछताछ करना चाहता हूं जो मूल संस्थाओं को वापस लौटाता है जब बच्चे संस्थाओं के सेट के सभी सदस्य एक शर्त पर सच हो जाते हैं। यह स्थिति तारों की सूची में से एक के खिलाफ मेल खा रही है। यहाँ मैं कहाँ हूँ:

Criteria c = criteria(); 
Criteria ands = c.createCriteria("ands"); 
Disjunction dis = Restrictions.disjunction(); 
for (String value : values) { 
    dis.add(Restrictions.like("value", "%" + value + "%")); 
} 
ands.add(dis); 
return list(c); 

"ands" एक "मूल्य" क्षेत्र एक स्ट्रिंग है कि साथ संस्थाओं का सेट है। "मानदंड()" मूल वर्ग के लिए मानदंड बनाता है। "सूची()" सिर्फ मानदंडों को सूचीबद्ध करती है। सूची();

यह सिर्फ बल्कि सभी की तुलना में से कोई भी तत्व के खिलाफ मिलान किया जाता है।

आशा इस समझ में आता है। किसी भी मदद की बहुत सराहना की।

उत्तर

0

कि अलगाव एक संयोजन के रूप में नहीं करना चाहिए?

+0

हाय, यह एक अलगाव हो सकता है क्योंकि मैं माता पिता को चुनने के लिए जहां संग्रह में हर तत्व की तरह है चाहता हूँ की जरूरत है या तो स्ट्रिंग ए, या स्ट्रिंग बी, या स्ट्रिंग सी। आदि –

3

एक सैद्धांतिक अभ्यास के रूप में, आप कुछ इस तरह कर सकते हैं:

Criterion condition = ...; 

Criteria c = s.createCriteria(Parent.class, "p"); 
DetachedCriteria dc = DetachedCriteria.forClass(Parent.class, "p2") 
    .createCriteria("ands", "c") 
    .add(Restrictions.not(condition)) 
    .add(Property.forName("p.id").eqProperty("p2.id")) 
    .setProjection(Projections.id()); 

c.add(Subqueries.notExists(dc)); 

हालांकि, इस पद्धति व्यावहारिक उपयोग के लिए अच्छा नहीं है, क्योंकि यह join (मानदंड एपीआई में in elements खंड के अभाव के कारण) अतिरिक्त आवश्यकता है। यह भी ध्यान रखें कि यह डबल निषेध (SELECT ... WHERE NOT EXISTS (SELECT ... WHERE NOT <condition>)) का उपयोग करता है, तो यह NULL रों के साथ समस्याओं हो सकता है।

संपादित करें:

from Parent p 
where not exists (select c from p.ands c where not <condition>) 

या

from Parent p 
where not exists (select c from Child c 
    where not <condition> and c in elements(p.ands)) 

लेकिन, जहाँ तक मैं समझता हूँ, दोनों प्रश्नों मानदंड एपीआई में व्यक्त नहीं किया जा सकता है: HQL में यह इस तरह लिखा जा सकता है (आप सबक्वेरी में from p.ands नहीं लिख सकते हैं और in elements उपयोग नहीं कर सकते)। तो, मानदंड एपीआई में आप अतिरिक्त उपयोग करने के लिए शामिल होने के (ध्यान दें 2 Parent ओं):

from Parent p 
where not exists (select c from Parent p2 join p2.ands c 
    where not <condition> and p = p2) 
+0

इसके लिए धन्यवाद। बस इसकी संभावनाओं की खोज। शायद एचक्यूएल यहाँ बेहतर होगा, लेकिन मुझे तत्वों() खंड को समझने में परेशानी हो रही है। क्या मैं किसी भी तरह से सभी तत्वों (parent.ands) का उपयोग कर सकता हूं? –

+0

@ एंड्रयू: संपादित – axtavt

+0

आह - ठंडा। यह उम्मीद के रूप में काम करता है। बहुत बहुत धन्यवाद। अभी प्रदर्शन के बारे में चिंतित है। –

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