2013-07-17 12 views
19

मेरे पास बिल्ली वर्ग और एक मालिक वर्ग है। एक बिल्ली के पास एक मालिक होता है लेकिन मालिक के पास कई बिल्लियों हो सकते हैं। मैं क्या पूछना चाहता हूं "उन सभी मालिकों को प्राप्त करें जिनके पास नीली आंखों वाली बिल्ली है"।हाइबरनेट मानदंड क्वेरी में शामिल हो गए हैं

class Cat{ 
Owner owner; //referenced from Owner.id 
String eyeColor; 
} 

class Owner{ 
List<Cat> catList; 
} 

मैंने कुछ कोडों की कोशिश की लेकिन मुझे नहीं पता कि क्या करना है।

Criteria criteria = getCurrentSession().createCriteria(cat.getClass(), "cat"); 
criteria.createAlias("cat.owner", "owner");  
criteria.add(Restrictions.eq("cat.eyeColor", "blue"); 
+1

एसोसिएशन बिडरेक्शनल है? ऐसी स्थिर क्वेरी के लिए एचक्यूएल का उपयोग क्यों न करें? –

+0

@JBNizet क्षमा करें, लेकिन मेरे पास एचक्यूएल का उपयोग करने की कोई पसंद नहीं है। – hellzone

+0

एसोसिएशन बिडरेक्शनल है? आपके पास विकल्प क्यों नहीं है? यह एक बढ़ई की तरह है जो हथौड़ा का उपयोग करने की अनुमति नहीं है! –

उत्तर

34

मानदंड केवल अनुमान, या मूल इकाई का चयन कर सकते हैं। कुछ शामिल नहीं इकाई। कुछ प्रश्न इस प्रकार मानदंड के साथ व्यक्त करना असंभव हैं (जो एचक्यूएल का उपयोग करने के लिए एक और अच्छा कारण है, बहुत बेहतर पठनीयता और एकता के अलावा)।

सभी यहां खो नहीं गए हैं, हालांकि, क्योंकि आपका सहयोग द्विपक्षीय है। तो आप बस HQL क्वेरी

select distinct owner from Owner owner 
join owner.cats cat 
where cat.eyeColor = 'blue' 

कौन सा

Criteria c = session.createCriteria(Owner.class, "owner"); 
c.createAlias("owner.cats", "cat"); 
c.add(Restrictions.eq("cat.eyeColor", "blue"); 
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 
+0

मेरे मामले में, बिल्ली मालिक को जानता है, लेकिन मालिक को उसकी बिल्लियों के बारे में पता नहीं है। मानदंड कैसा दिखता है? – Kayser

+0

जैसा कि मेरे उत्तर में कहा गया है, AFAIK (जब तक कि वे इसे नए रिलीज़ में संभव नहीं बनाते), मानदंडों का उपयोग करना संभव नहीं है। एचक्यूएल का प्रयोग करें, या जेपीए 2 मानदंड एपीआई का प्रयोग करें। –

+0

यह इन-मेमोरी "विशिष्ट" ऑपरेशन करता है। यदि एक मालिक के पास एक मिलियन ब्लू-आंख वाली बिल्लियों हैं, तो यह उन्हें केवल एक ही मालिक को खोजने के लिए डेटाबेस से लाएगा (उदाहरण शायद पूछताछ करने वाले वास्तविक मामले नहीं हैं, आपको वास्तविक कार्डिनिटी नहीं पता है)। मेरा जवाब देखें कि यह डेटाबेस में कैसे किया जा सकता है। – Oliv

4

है के बराबर की जरूरत है इस प्रयास करें:

DetachedCriteria dc = DetachedCriteria.forClass(Cat.class, "inner") 
    .add(Restrictions.eq("eyeColor", "blue")) 
    .add(Restrictions.eqProperty("inner.owner", "outer.pk")); 

session.createCriteria(Owner.class, "outer") 
    .add(Subqueries.exists(dc)) 
    .list(); 

इस डेटाबेस में सूचकांक का उपयोग कर सकते हैं और एक में काम नहीं चलेगा -मेमरी distinct ऑपरेशन @ जेबी निजेट के संस्करण में (वहां मेरी टिप्पणी देखें)। सूचकांक हो जाएगा:

CREATE INDEX idx_cat_owner_eyecolor ON Cat(fkOwner, eyeColor) 

distinct आपरेशन (या तो एसक्यूएल में या स्मृति में) एक कोड गंध की के रूप में सोचना। इसका शायद ही कभी उपयोग किया जाता है और कई नौसिखिया प्रोग्रामर समस्या का समाधान करने के लिए इसका उपयोग करते हैं "मुझे यह पंक्ति दो बार क्यों है"। इस मामले में लगभग हमेशा लिखा जा सकता है। जब आवश्यक हो, मामलों का प्रयोग करें, कुछ हैं।

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