ऐसा लगता है कि हाइबरनेट CHAR(n)
. प्रकार का मान पढ़ता है Character
. के रूप में . इसे VARCHAR(n)
to पर डालने का प्रयास करें :
Query q2 = em.createNativeQuery(
"select cast(sc_cur_code as VARCHAR2(3)), sc_amount from sector_costs");
Session
. के माध्यम से हाइबरनेट का उपयोग करते समय इंटरफ़ेस, आप addScalar()
. के साथ स्पष्ट रूप से एक प्रकार का परिणाम सेट कर सकते हैं इसके बजाय (unwrap()
. के माध्यम से भी पहुँचा जा सकता है) जेपीए 2.0 में):
Query q2 = em.createNativeQuery(
"select sc_cur_code, sc_amount from sector_costs");
q2.unwrap(SQLQuery.class).addScalar("sc_cur_code", StringType.INSTANCE);
HHH-2220 से शुरू होकर, हाइबरनेट JIRA में इस समस्या से संबंधित बहुत सारे अनसुलझे मुद्दे हैं।
यहाँ HHH-2220 की टिप्पणियों से मैक्स राइडहल एंडरसन द्वारा एक स्पष्टीकरण दिया गया है:
<ब्लॉककोट>वर्तमान में हाइबरनेट एसक्यूएल प्रकारों से हाइबरनेट/जावा प्रकारों के लिए एक प्रकार की "ऑटोमैजिक" मैपिंग का समर्थन करता है - इस तरह की मैपिंग करने में कई अस्पष्टताओं के कारण यह कभी-कभी आप जो चाहते हैं उससे मेल नहीं खाएगा।
यही कारण है कि हम हमेशा स्पष्ट addScalar का उपयोग करने की अनुशंसा करते हैं या यदि आप नहीं चाहते हैं कि आपके पूरे कोड में बोली के उप-वर्ग का उपयोग यह निर्धारित करने के लिए किया जाए कि आप कौन सी कई संभावित मैपिंग चाहते हैं।
CHAR के साथ समस्या सबसे अधिक समस्याग्रस्त है, लेकिन इसे ठीक करना आसान नहीं है - हमें एक विशिष्ट लंबाई के बजाय एक श्रेणी को मैप करने के लिए एक रजिस्टर टाइप (प्रकार, से, से, टाइपनाम) की आवश्यकता होगी ... मैपिंग अस्पष्टता में (उदाहरण के लिए कभी-कभी आप एक सरणी अन्य बार स्ट्रिंग इत्यादि चाहते हैं।) इसलिए किसी भी मूल एसक्यूएल पूछताछ के लिए .addScalar का उपयोग करने की अनुशंसा की जाती है - स्वचालित खोज के आधार पर हमेशा जोखिम भरा होगा और केवल न्यूनतम उपयोग किया जाना चाहिए।
यदि आपके पास हाइबरनेट मैपिंग कॉन्फ़िगरेशन फ़ाइल में वर्णित आपकी मूल क्वेरी है, तो आपको <return-scalar ...>
को परिभाषित करने की आवश्यकता है लौटाए गए प्रत्येक मान के लिए। नोट:आपको सभी लौटाए गए मानों की गणना करनी होगी, क्योंकि जब आप रिटर्न प्रकारों को स्पष्ट रूप से परिभाषित करते हैं, तो ऑटोडिस्कवरी बंद हो जाती है और केवल घोषित कॉलम लौटाए जाते हैं।
<sql-query name="myQuery">
<query-param name="days" type="int" />
<return-scalar column="count" type="int" />
<return-scalar column="section_name" type="string" />
<![CDATA[select count(id) as count, section_name from document where days <= :days]]>
</sql-query>