2011-07-08 9 views
6

को अद्यतन करने के एक नए हाइबरनेट संस्करण (लगता है कि यह JBoss से 6 JBoss 4.2.2 से स्विच के साथ आया था) को अपग्रेड करने के बाद के बाद विफल रहता है में शामिल होने, कुछ क्वेरी संदेश के साथ विफल:"स्वचालित" नेस्टेड संस्थाओं को लाना हाइबरनेट

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB 
LEFT JOIN FETCH entityA.entityB.someField 
WHERE entityA.entityB.anotherField LIKE :someParameter 

समस्या का समाधान "entityA.entityB" एक उपनाम दे रहा है और उसके बाद WHERE खंड में इस अन्य नाम का उपयोग करने के लिए: Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties,classAlias=null,role=null,tableName= (...)

ऐसा हमेशा जब इस तरह एक प्रश्न का उपयोग कर रहा है। लेकिन कुछ प्रश्नों में LEFT JOIN FETCH स्पष्ट रूप से नहीं दिया गया है लेकिन अभी भी WHERE खंड संदर्भित इकाई की संपत्ति का उपयोग करता है। क्या यह भी असफल होगा? क्या बदल गया है, ताकि यह एक नए जेबॉस संस्करण में स्विच करने के बाद अचानक विफल हो जाए?

निम्नलिखित question इस प्रश्न से संबंधित है और समाधान शामिल है, लेकिन समस्या को समझा नहीं है।

+0

आपके प्रश्न ने मुझे समस्या के समाधान को समझने में मदद की, हाइबरनेट 3.2.6.ga से 3.5.6-फाइनल तक अपग्रेड करने के बाद, मुझे 'क्वेरी निर्दिष्ट करने में शामिल क्वेरी मिल रही थी, लेकिन प्राप्त संघ का मालिक नहीं था चयनित सूची में मौजूद ', उपर्युक्त दृष्टिकोण का उपयोग करके आपने सुझाव दिया है कि यह काम करता है, हालांकि' क्यों 'के साथ आपकी मदद नहीं कर सकता! –

+0

यह एचक्यूएल या मानक जेपीक्यूएल है? – wrschneider

+0

यह 'EntityManager.createQuery' के माध्यम से किया जाता है, इसलिए मुझे लगता है कि यह एचक्यूएल है। –

उत्तर

3

क्वेरी होना चाहिए

SELECT entityA FROM EntityA entityA 
JOIN FETCH entityA.entityB entityB 
LEFT JOIN FETCH entityB.someField 
WHERE entityB.anotherField LIKE :someParameter 

अर्थात आपको प्रत्येक शामिल इकाई के लिए उपनाम असाइन करना चाहिए, और बाद में शामिल होने या प्रतिबंधों के लिए इस उपनाम का उपयोग करना चाहिए।

+0

हाँ मुझे पता है .. लेकिन यह हमेशा इस तरह से किया गया है। और हाइबरनेट 3 से 4 तक स्विच करने से स्वीकृति बदल गई और इससे हमारे लिए माइग्रेशन काम बहुत अधिक हो जाता है। मैं सिर्फ यह जानना चाहता था कि क्यों उन्होंने अचानक हाइबरनेट को पीछे छोड़ दिया-संक्षिप्त सूचना पर संगत। –

+0

मेरा अनुमान है कि आपका कोड अब एक निश्चित हाइबरनेट बग पर भरोसा करके दुर्घटना से काम करता है। –

0

मुझे अपनी परियोजना में एक ही समस्या है और इसे हल करना बहुत मुश्किल है क्योंकि मेरे पास बहुत से मॉड्यूल के साथ एक बड़ी विरासत प्रणाली है जो पूर्व-संकलित नामों का उपयोग करती है और मांग पर बनाए गए कई प्रश्न हैं। पूरे सिस्टम को पहचानने और संशोधित करने और हाइबरनेट के पुराने संस्करण का उपयोग करने के साथ-साथ काम करने वाले बदलावों को भी एक बहुत ही कष्टप्रद काम और त्रुटि प्रवण है। मैं जेबीओएस में 6.4 से 6.4.6 तक इस समस्या से गुज़र रहा हूं जब हाइबरनेट संस्करण 4.2.18 से 4.2.22 तक अपग्रेड किया गया था और यह त्रुटि दिखाई दे रही है। इसे हल करने के लिए मैं प्रारंभिक डिफ़ॉल्ट संस्करण 4.2.18 में केवल हाइबरनेट मुख्य मॉड्यूल का डाउनग्रेड करता हूं लेकिन यह अच्छा नहीं है क्योंकि जब जेबॉस के अगले पैच आते हैं तो मुझे इसे फिर से बदलने की आवश्यकता होती है। मैं जेबॉस मॉड्यूल और persistence.xml और jboss-deployment-strcuture.xml में कुछ कॉन्फ़िगरेशन का उपयोग करने की कोशिश कर रहा हूं लेकिन अभी तक सफलता के बिना।

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