2009-04-06 8 views
67

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

एचक्यूएल के साथ, मैं उन मालिकों का चयन कर सकता हूं जिनके पास प्रश्न में शामिल होने के बजाय 'फिडो' नामक एक पालतू जानवर है (मालिक वर्ग में पालतू जानवरों का एक सेट जोड़ने के बजाय)।

क्या हाइबरनेट मानदंडों का उपयोग करके किया जा सकता है? यदि हां, तो कैसे?

धन्यवाद, जम्मू

उत्तर

56

मेरे समझ जाता है कि अगर आप इस HQL का उपयोग कर, आप एक कार्तीय पैदा कर रहे एक फिल्टर के साथ शामिल हो, एक आंतरिक में शामिल होने के बजाय। मानदंड प्रश्न यह करने का समर्थन नहीं करते हैं।

+0

डेविड इस पर सही है, तो आप एक मानदंड आप HSQL –

+8

क्षमा साथ यह कर सकते हैं के साथ ऐसा नहीं कर सकते, अचानक एक जवाब लगभग चार वर्ष है कि, कोई टिप्पणी या स्पष्टीकरण के साथ पर एक downvote मिला है। कोई भी विस्तार करने की देखभाल करता है? –

+13

मैंने अभी आपको –

-1

एक SQLCriterion है, जिसे आप मनमाने ढंग से SQL दे सकते हैं, और अपने Criteria में जोड़ सकते हैं। स्ट्रिंग में, टोकन {उपनाम} "रूट इकाई के उपनाम द्वारा प्रतिस्थापित किया जाएगा।"

+2

यह कैसे करें? कोई उदाहरण? – iPhoneJavaDev

+0

कोई उदाहरण या (कम से कम) लिंक प्रदान नहीं किया गया। – n3k0

+0

SQLCriterion ने संरक्षक – AndreyT

1

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

DetachedCriteria pets = DetachedCriteria.For<Pet>("pet") 
    .SetProjection(Projections.Property("pet.ownername")) 
    .Add(/* some filters */); 

session.CreateCriteria(typeof(Owner)) 
    .Add(Subqueries.PropertyIn("name", pets); 

ग्रहण: सुनिश्चित नहीं करता है, तो यह जावा में एक ही काम करता है, संभवत: यह एक ही है।

73

यह वास्तव में मापदंड के साथ संभव है:

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(Owner.class); 
ownerCriteria.setProjection(Property.forName("id")); 
ownerCriteria.add(Restrictions.eq("ownername", "bob")); 

Criteria criteria = getSession().createCriteria(Pet.class); 
criteria.add(Property.forName("ownerId").in(ownerCriteria)); 

अद्यतन: यह वास्तव में के बजाय एक में शामिल होने का एक उप-क्वेरी का निष्पादन करता है, लेकिन यह आप दो संस्थाओं पर मानदंड है कि एक हाइबरनेट संबंध नहीं है का उपयोग करने के लिए अनुमति देता है परिभाषित।

+1

संरक्षित किया है क्यों इतने सारे वोट हैं? यह अभी भी दो अलग-अलग मानदंड सही है? – Reddy

+3

मेरे लिए पूरी तरह से काम किया, यहां एक अप-वोट आता है – Avanst

+30

समस्या यह है कि यह शामिल नहीं है, लेकिन सबक्वायरी - इसका मतलब है कि आप अपने मानदंडों को कॉलम द्वारा पहले मानदंडों से ऑर्डर नहीं कर सकते हैं। –

0
Criterion ownerCriterion = Restrictions.sqlRestriction(SELECT ownerId FROM Owner WHERE ownerName ='bob'); 
Criteria criteria = getSession().createCriteria(Pet.class); 
criteria.createCriteria("ownerId").add(ownerCriterion); 
संबंधित मुद्दे