ऐसा क्यों होता है
समस्या यह है कि PostgreSQL टेक्स्ट और गैर-टेक्स्ट डेटा प्रकारों के बीच कास्ट करने के बारे में अत्यधिक सख्त है। यह एक निहित कास्ट की अनुमति नहीं देगा (बिना किसी CAST
.) या ::
SQL में) text
. जैसे टेक्स्ट प्रकार से या varchar
(character varying
) टेक्स्ट-जैसे नॉन-टेक्स्ट टाइप जैसे json
, xml
, आदि.
PgJDBC ड्राइवर varchar
के डेटा प्रकार को निर्दिष्ट करता है जब आप setString
. को कॉल करते हैं पैरामीटर असाइन करने के लिए। यदि कॉलम का डेटाबेस प्रकार, फ़ंक्शन तर्क, आदि वास्तव में varchar
नहीं है या text
, लेकिन इसके बजाय एक अन्य प्रकार, आपको एक प्रकार की त्रुटि मिलती है। यह कई अन्य ड्राइवरों और ओआरएम के बारे में भी सच है।
पीजीजेडीबीसी:stringtype=unspecified
PgJDBC का उपयोग करते समय सबसे अच्छा विकल्प आम तौर पर stringtype=unspecified
. पैरामीटर पास करना है . यह setString
. पास करने के डिफ़ॉल्ट व्यवहार को ओवरराइड करता है मान varchar
. के रूप में और इसके बजाय इसे अपने डेटा प्रकार का "अनुमान" लगाने के लिए डेटाबेस पर छोड़ देता है। लगभग सभी मामलों में यह वही करता है जो आप चाहते हैं, स्ट्रिंग को उस प्रकार के इनपुट सत्यापनकर्ता को पास करना जिसे आप स्टोर करना चाहते हैं।
सभी:CREATE CAST ... WITH FUNCTION ...
आप इसके बजाय CREATE CAST
. कर सकते हैं एक प्रकार-दर-प्रकार के आधार पर इसे अनुमति देने के लिए डेटा-प्रकार विशिष्ट कलाकारों को परिभाषित करने के लिए, लेकिन इसके अन्यत्र दुष्प्रभाव हो सकते हैं। अगर आप ऐसा करते हैं, तो नहीं करें WITHOUT FUNCTION
का उपयोग करें कास्ट, वे प्रकार सत्यापन को बायपास करेंगे और त्रुटियों का परिणाम देंगे। आपको डेटा प्रकार के लिए इनपुट/सत्यापन फ़ंक्शन का उपयोग करना चाहिए। CREATE CAST
का उपयोग करना अन्य डेटाबेस ड्राइवरों के उपयोगकर्ताओं के लिए उपयुक्त है जिनके पास स्ट्रिंग/पाठ पैरामीटर के प्रकार को निर्दिष्ट करने वाले ड्राइवर को रोकने का कोई तरीका नहीं है।
उदा.
CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$
SELECT json_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;
CREATE CAST (text AS json)
WITH FUNCTION json_intext(text) AS IMPLICIT;
सभी:कस्टम प्रकार हैंडलर
यदि आपका ओआरएम अनुमति देता है, तो आप डेटा प्रकार और उस विशिष्ट ओआरएम के लिए एक कस्टम प्रकार हैंडलर लागू कर सकते हैं। यह अधिकतर तब उपयोगी होता है जब आप मूल जावा प्रकार का उपयोग कर रहे होते हैं जो String
का उपयोग करने के बजाय PostgreSQL प्रकार के लिए अच्छी तरह से मैप करता है , हालांकि यह तब भी काम कर सकता है जब आपका ओआरएम आपको एनोटेशन आदि का उपयोग करके टाइप हैंडलर निर्दिष्ट करने देता है।
कस्टम प्रकार के हैंडलर को लागू करने के तरीके ड्राइवर-, भाषा- और ओआरएम-विशिष्ट हैं। json
. के लिए जावा और हाइबरनेट के लिए यहां एक उदाहरण दिया गया है ।
PgJDBC:PGObject
का उपयोग करके हैंडलर टाइप करें
यदि आप जावा में मूल जावा प्रकार का उपयोग कर रहे हैं, तो आप PGObject
. का विस्तार कर सकते हैं अपने प्रकार के लिए PgJDBC टाइप मैपिंग प्रदान करने के लिए। आपको अपने PGObject
. का उपयोग करने के लिए संभवतः एक ORM-विशिष्ट प्रकार के हैंडलर को लागू करने की भी आवश्यकता होगी , चूंकि अधिकांश ओआरएम केवल toString
. को कॉल करेंगे उन प्रकारों पर जिन्हें वे नहीं पहचानते। जावा और पोस्टग्रेएसक्यूएल के बीच जटिल प्रकारों को मैप करने का यह पसंदीदा तरीका है, लेकिन सबसे जटिल भी है।
PgJDBC:setObject(int, Object)
. का उपयोग करके हैंडलर टाइप करें
यदि आप String
का उपयोग कर रहे हैं जावा में मान रखने के लिए, अधिक विशिष्ट प्रकार के बजाय, आप JDBC विधि setObject(integer, Object)
को लागू कर सकते हैं स्ट्रिंग को स्टोर करने के लिए कोई विशेष डेटा प्रकार निर्दिष्ट नहीं है। JDBC ड्राइवर स्ट्रिंग प्रतिनिधित्व भेजेगा, और डेटाबेस गंतव्य कॉलम प्रकार या फ़ंक्शन तर्क प्रकार से प्रकार का अनुमान लगाएगा।
यह भी देखें
प्रश्न:
- पोस्टग्रेएसक्यूएल JSON कॉलम को हाइबरनेट वैल्यू टाइप में मैप करना
- क्या JPA (EclipseLink) कस्टम प्रकार संभव हैं?
बाहरी:
- http://www.postgresql.org/message-id/[email protected]
- https://github.com/pgjdbc/pgjdbc/issues/265
- http://www.pateldenish.com/2013/05/inserting-json-data-into-postgres-using-jdbc-driver.html