2012-11-07 11 views
7

में डिटेक्टेडक्रिटिया के साथ नेस्टेड ऑब्जेक्ट लाने में उत्सुकता मुझे कुछ अतिरिक्त एसोसिएशन लाने के लिए एक बड़ी हाइबरनेट डिटेक्टेड कैटरीडिया क्वेरी को संशोधित करना होगा।हाइबरनेट

मेरे वस्तु ग्राफ संरचना नीचे जैसा दिखता है, मैं बिक्री प्रत्येक कार के साथ जुड़े लाने के लिए करना चाहते हैं:

DetachedCriteria criteria = DetachedCriteria.forClass(Showroom.class); 
// ... Existing criteria query code ... 
criteria.setFetchMode("cars.sales", FetchMode.JOIN); 

लेकिन associationPath तर्क:

<class name="Showroom" table="showroom"> 
    ... 
    <bag name="cars" lazy="false"> 
     <one-to-many class="Car" /> 
    </bag> 
    ... 
</class> 

<class name="Car" table="car"> 
    ... 
    <set name="sales" lazy="true"> 
     <one-to-many class="Sale" /> 
    </set> 
    ... 
</class> 

मुझे क्या करना चाहते हैं की तरह कुछ है setFetchMode में डॉट नोटेशन को अनदेखा करना प्रतीत होता है और मुझे एक LazyInitializationException मिल जाता है:

कारण: org.hibe rnate.LazyInitializationException: lazily भूमिका का एक संग्रह प्रारंभ करने में विफल: Car.sales, कोई सत्र या सत्र

बंद हो गया मैं गया है चारों ओर खोज और अब तक कोई उदाहरण या जानकारी नहीं मिली। Hibernate documentation नेस्टेड एसोसिएशन लाने के तरीके पर उदाहरण प्रदान नहीं करता है, और Javadoc for setFetchMode यह सुझाव देता है कि मेरा डॉट-नोटेशन दृष्टिकोण काम करना चाहिए ...

किसी भी मदद की सराहना की जाएगी।

उत्तर

15
DetachedCriteria dc = DetachedCriteria.forClass(ShowRoom.class, "showRoom"); 
criteria.setFetchMode("showRoom.cars", FetchMode.JOIN); 
criteria.createAlias("showRoom.cars", "car", CriteriaSPecification.LEFT_JOIN); 
criteria.setFetchMode("car.sales", FetchMode.JOIN); 

आप मानदंड क्वेरी में गुण गुण नहीं कर सकते हैं। और यहां तक ​​कि एक एचक्यूएल प्रश्नों में, cars.sales अमान्य है, क्योंकि cars एक संग्रह को संदर्भित करता है, न कि कार के उदाहरण के लिए। कारों के संग्रह में कार को संदर्भित करने में सक्षम होना आवश्यक है। यही है createAlias() कॉल करता है। उपर्युक्त

select showRoom from ShowRoom 
left join fetch showRoom.cars car 
left join fetch car.sales 
+0

बिल्कुल सही है, स्पष्टीकरण के लिए धन्यवाद। मुझे एहसास नहीं हुआ कि एलीअस के साथ-साथ फील्ड उपनाम बनाने का दोहरा उद्देश्य था। – seanhodges