2010-02-12 16 views
13

हाइबरनेट मानदंडों के साथ संभव है?हाइबरनेट मानदंड और कई शामिल हैं

select A.something, B.something, C.something, D.something 
    from A JOIN B on A.id = B.id_fk 
      JOIN C ON B.id = C.id_fk 
      JOIN D ON C.id = D.id_fk; 
+0

http://stackoverflow.com/questions/8726396/hibernate-criteria-join-with-3-tables उल्लेख लिंक आप मदद कर सकते हैं ऊपर। –

उत्तर

17

मैं बिल्कुल वैसा ही समस्या मिल गया है, और इस तरह इसे हल करने में सक्षम था:

return criteria.createCriteria(A.class) 
       .createCriteria("b", "join_between_a_b") 
       .createCriteria("c", "join_between_b_c") 
       .createCriteria("d", "join_between_c_d") 
       .add(Restrictions.eq("some_field_of_D", someValue)); 

नोट: "b", "c" और "d" कोड में ऊपर A, B और C में विशेषता नाम का उल्लेख कक्षाएं, संगत रूप से (कक्षा A विशेषता b है और इसी तरह)।

इस समाधान के लिए आपको lazy और fetch पैरामीटर भी आपके A.hbm.xml में सेट करने की आवश्यकता नहीं है।

+0

निम्न SQL के बारे में कैसे करें: A.columnA1, B.columnB1, C.columnC1 का चयन करें। एएफके_आईडी = बीआईडी ​​आंतरिक बी में सी। एफके_आईडी = बीआईडी ​​में शामिल हों। – maximilianus

+0

कृपया इसके लिए एक अलग प्रश्न खोलें। – mindas

1

आपके मानदंड में लाने के मोड सेट, की तरह का प्रयास करें:

criteria.setFetchMode(..., FetchMode.EAGER) 

यह एक में शामिल होने के सवाल पैदा करता है। आपको अधिक जानकारी here मिल सकती है।

2

Hibernate Reference material में कुछ अच्छे उदाहरण हैं जो बाहरी जुड़ने के साथ एसोसिएशन लाने के लिए setFetchMode का उपयोग करने के लिए दिखाते हैं।

एक उदाहरण है:

List books = sess.createCriteria(Book.class) 
.setFetchMode("chapters", FetchMode.EAGER) 
.setFetchMode("reviews", FetchMode.EAGER) 
.list(); 

वहाँ भी information there about different fetching stragies है कि आप के लिए काम का हो सकता है।

+0

दरअसल यह मेरे लिए काम नहीं करता था, मुझे इसे पोस्ट किए गए उत्तर में करना था। ऐसा इसलिए हो सकता है क्योंकि मेरे पास 'डी' पर अतिरिक्त मानदंड था। – mindas

0

हाँ, वास्तव में ऐसा करने के कई तरीके हैं:

  1. जब संघ मानचित्रण, गलत पर अपने lazyness सेट और उसके शामिल होने के लिए मोड से लाएं। यह सभी मानदंड प्रश्नों को प्रभावित करेगा।
  2. अन्य उत्तरों द्वारा विस्तृत के रूप में setFetchMode का उपयोग करें।
  3. मानदंडों का उपयोग करें .createAlias ​​(या createCriteria)। यह आपको उन पंक्तियों को और प्रतिबंधित करने की अनुमति देता है जिन्हें आप शामिल करना चाहते हैं।
संबंधित मुद्दे