2009-10-06 16 views
16

मान लीजिए मैं जैसे श्रेणियां होती हैं:हाइबरनेट मापदंड क्वेरी

class A { 
B getB(); 
C getC(); 
} 

class B { 
String getFoo(); 
} 

class C { 
int getBar(); 
} 

और मैं एक पर मापदंड, अलग उपवर्ग गुणों पर दो फिल्टर, जैसे फ़िल्टर करना चाहते हैं:

Criteria criteriaA = session.createCriteria(A.class); 
Criteria criteriaB = criteriaA.createCriteria("b").add(Restrictions.eq("foo", "Something")); 
Criteria criteriaC = criteriaA.createCriteria("c").add(Restrictions.eq("bar", 0)); 

मैं जो करना चाहता हूं वह एक "या" खंड का उपयोग करके मानदंड बी और मानदंड को जोड़ता है, जैसे:

//this does not work 
criteriaA.add(Restrictions.disjunction().add(criteriaB).add(criteriaC)); 

मैं इसे कैसे पूरा कर सकता हूं? मैं यहाँ एपीआई पर थोड़ा ठोकर खा रहा हूँ।

उत्तर

24

उपयोग aliases नेस्टेड मापदंड के बजाय:

Criteria criteria = session.createCriteria(A.class) 
.createAlias("b", "b_alias") 
.createAlias("c", "c_alias") 
.add(Restrictions.disjunction() 
    .add(Restrictions.eq("b_alias.foo", "Something")) 
    .add(Restrictions.eq("c_alias.bar", "0")) 
); 
+0

उपनाम अनावश्यक हैं। –

+0

इसे आज़माकर - धन्यवाद, शतरंज – RMorrisey

+0

उपनाम के बिना आप यह कैसे करेंगे? – RMorrisey

4

आप केवल बनाने के लिए एक मापदंड तो जैसे वस्तु की जरूरत है।

Criteria criteria = session.createCriteria(A.class); 
criteria.add(Restriction.disjunction() 
    .add(Restriction.eq("b.foo", "something")) 
    .add(Restriction.eq("c.bar", 0))); 
+0

यह काम नहीं करता है; मुझे एक त्रुटि मिलती है: org.hibernate.QueryException: संपत्ति को हल नहीं कर सका: b.foo: com.myproject.A – RMorrisey

+0

ऐसा लगता है जैसे यह केवल एक स्तर के गुणों के साथ काम करेगा, लेकिन वास्तविक फ़िल्टर के लिए नहीं । – RMorrisey

+0

आपको createQuery के createAlias ​​का उपयोग करना होगा। मैंने तदनुसार जवाब संपादित किया। –

3

किसी और मामले में किसी को में यह उपयोगी पाता है, मैं, समस्या जो API द्वारा स्वीकृत किया गया प्रतीत होता करने के लिए एक और अधिक जटिल जवाब मिल गया हालांकि मैं यह परीक्षण करने के लिए इससे पहले कि ChssPly उसकी (सरल) समाधान तैनात नहीं मिला:

DetachedCriteria bValues = DetachedCriteria.forClass(A.class); 
bValues.createCriteria("b").add(Restrictions.eq("foo", "something")); 

DetachedCriteria cValues = DetachedCriteria.forClass(A.class); 
cValues.createCriteria("c").add(Restrictions.eq("bar", 0)); 

Restrictions.or(Subqueries.in("id", bValues), Subqueries.in("id", cValues)); 
+0

दिलचस्प, मैंने कभी इस तरह से कोशिश करने के लिए सोचा नहीं है। परिणामी क्वेरी उपनामों के माध्यम से प्राप्त एक से काफी अलग (और, संभवतः धीमी) होगी। लेकिन उपनाम विफल होने पर यह आपके SQLRRrrration समस्या को हल करने का तरीका हो सकता है। – ChssPly76

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