यह वास्तव में अपेक्षित व्यवहार है अगर मैंने आपके कॉन्फ़िगरेशन को सही ढंग से समझा।
हाइबरनेट एक क्वेरी के लिए अलग-अलग परिणाम नहीं देता है जिसमें बाहरी सम्मिलित करने के लिए एक संग्रह के लिए सक्षम होना चाहिए (भले ही मैं अलग कीवर्ड का उपयोग करूं)? सबसे पहले, आपको एसक्यूएल को समझने की जरूरत है और कैसे ओआरएस जॉइन एसक्यूएल में काम करता है। यदि आप SQL में बाहरी जॉइन को पूरी तरह से नहीं समझते और समझते हैं, तो इस FAQ आइटम को पढ़ना जारी न रखें, लेकिन SQL मैनुअल या ट्यूटोरियल से सलाह लें। अन्यथा आप निम्नलिखित स्पष्टीकरण को नहीं समझेंगे और आप हाइबरनेट फोरम पर इस व्यवहार के बारे में शिकायत करेंगे।
समान आदेश ऑब्जेक्ट के डुप्लिकेट संदर्भों को लौटाने वाले विशिष्ट उदाहरण:
List result = session.createCriteria(Order.class)
.setFetchMode("lineItems", FetchMode.JOIN)
.list();
<class name="Order">
...
<set name="lineItems" fetch="join">
List result = session.createCriteria(Order.class)
.list();
List result = session.createQuery("select o from Order o left join fetch o.lineItems").list();
ये सभी उदाहरण एक ही SQL स्टेटमेंट का उत्पादन करते हैं:
SELECT o.*, l.* from ORDER o LEFT OUTER JOIN LINE_ITEMS l ON o.ID = l.ORDER_ID
जानना चाहते हैं कि डुप्लिकेट क्यों हैं? एसक्यूएल परिणाम को देखें, हाइबरनेट इन डुप्लिकेट को बाहरी सम्मिलित परिणाम के बाईं ओर छिपाता नहीं है, लेकिन ड्राइविंग तालिका के सभी डुप्लिकेट लौटाता है। यदि आपके पास डेटाबेस में 5 ऑर्डर हैं, और प्रत्येक ऑर्डर में 3 लाइन आइटम हैं, तो परिणाम 15 पंक्तियों का होगा। इन प्रश्नों की जावा परिणाम सूची में 15 तत्व होंगे, सभी प्रकार के ऑर्डर। हाइबरनेट द्वारा केवल 5 ऑर्डर इंस्टेंसेस बनाए जाएंगे, लेकिन SQL परिणाम के डुप्लिकेट को इन 5 इंस्टेंस के डुप्लिकेट संदर्भ के रूप में संरक्षित किया जाता है। यदि आप इस अंतिम वाक्य को नहीं समझते हैं, तो आपको जावा पर पढ़ने की जरूरत है और जावा हीप पर एक उदाहरण और इस तरह के उदाहरण के बीच का अंतर।
(बाईं ओर क्यों सम्मिलित हों? यदि आपके पास कोई पंक्ति आइटम नहीं है, तो परिणाम सेट में 16 पंक्तियाँ होंगी जिसमें NULL दाईं ओर भरता है, जहाँ पंक्ति वस्तु डेटा अन्य आदेश के लिए है। आप चाहे तो भी आदेश दे सकते हैं। उनके पास लाइन आइटम नहीं हैं, ठीक है (यदि नहीं, तो अपने एचक्यूएल में एक आंतरिक जुड़ाव का उपयोग करें)।
हाइबरनेट डिफ़ॉल्ट रूप से इन डुप्लिकेट संदर्भों को फ़िल्टर नहीं करता है। कुछ लोग (आप नहीं) वास्तव में यही चाहते हैं। आप उन्हें कैसे फ़िल्टर कर सकते हैं?
ऐशे ही:
Collection result = new LinkedHashSet( session.create*(...).list() );