2012-01-12 7 views
5

में मूल स्केलर क्वेरी पर प्रॉक्सी लौटाता है। मैं अपने जेपीए दृढ़ता प्रदाता को एक्लिप्ससेंक 2.3 से हाइबरनेट 3.6.5 पर स्विच करने पर काम कर रहा हूं। अंतिम। समस्या एक देशी क्वेरी के साथ है। नोट: यह ग्रहण लिंक के साथ कोई समस्या नहीं थी। मैं एक तालिका से एक स्केलर मान, String प्राप्त करने का प्रयास कर रहा हूं जिसके लिए मेरे पास कोई इकाई घोषित नहीं है।getSingleResult हाइबरनेट

Query q = em.createNativeQuery("select description from foo where foo_id = ?"); 
q.setParameter(1, fooId); 
String description = (String)q.getSingleResult(); 

हाइबरनेट के साथ मैं एक ClassCastException मिलता है क्योंकि वस्तु लौटे वास्तव में एक प्रॉक्सी वस्तु है: यहाँ कोड है। मुझे नहीं पता कि यह किस प्रकार का है, लेकिन मुझे पता है कि यह एक सरणी नहीं है (object.getClass().isArray() गलत है) और मुझे पता है कि यह एक सूची नहीं है (object instanceof Listfalse है)।

मुझे क्या याद आ रही है?

+0

क्या इंटरफ़ेस 'q.getSingleResult()। GetClass()। GetInterfaces()' वापसी? –

+0

अहह ... यही वही था जो मुझे चाहिए था। यह java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob, और java.io.Serializable प्रकार का है। यदि आप इसे उत्तर देते हैं तो मैं इसे स्वीकार करूंगा। मुझे यह भी पता नहीं था कि कॉलम एक क्लोब था और मुझे हैरान है कि एक्लिप्ससेंक मेरे लिए स्ट्रिंग में रूपांतरण कर रहा था। – Ryan

+0

खुश मैं मदद कर सकता था! –

उत्तर

4

प्रश्न के नीचे सारांश टिप्पणियाँ:

क्या इंटरफेस q.getSingleResult().getClass().getInterfaces() वापसी करता है?


यह प्रकार java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob, और java.io.Serializable की है। [...] मैं भी एहसास नहीं था स्तंभ एक CLOB था और मैं हैरान EclipseLink मेरे लिए स्ट्रिंग के लिए रूपांतरण कर रहा था हूँ


EclipseLink ऐसा लगता है कि बहुत चालाक CLOB कन्वर्ट करने के लिए है (जो वास्तव में वर्णों का एक बहुत लंबा अनुक्रम है, जैसे String) यदि आवश्यक हो तो String पर। हाइबरनेट के साथ यह स्पष्ट रूप से किया जाना चाहिए। मुझे लगता है कि यह जेपीए विनिर्देश का पालन करता है।

0

क्या आपने हाइबरनेट के लिए सही डेटाबेस बोली कॉन्फ़िगर की है? बोली का उपयोग स्केलर मानों के प्रकार को मैप करने के लिए किया जाता है।

+0

मैं ओरेकल डेटाबेस का उपयोग कर रहा हूं और मुझे इसे अपने एप्लिकेशन सर्वर में डेटासोर्स में कॉन्फ़िगर किया गया है। जब हाइबरनेट लॉग में रिपोर्ट शुरू करता है - बोली का उपयोग करना: org.hibernate.dialect.Oracle10gDialect तो मुझे लगता है कि यह इसे समझ गया। – Ryan