tl;डॉ
myPreparedStatement.setObject(
… ,
java.util.UUID.randomUUID()
)
विवरण
(ए) हमें अपना कोड दिखाएं।
PreparedStatement::setObject
java.util.UUID
passing पास करते समय काम करता है . आपके कोड में कुछ और समस्या होने की संभावना है।
(बी) कुछ चर्चा और उदाहरण कोड के लिए मेरी ब्लॉग पोस्ट यूयूआईडी वैल्यूज फ्रॉम जेडीबीसी टू पोस्टग्रेज देखें।
// Generate or obtain data to store in database.
java.util.UUID uuid = java.util.UUID.randomUUID(); // Generate a random UUID.
String foodName = "Croissant";
// JDBC Prepared Statement.
PreparedStatement preparedStatement = conn.prepareStatement( "INSERT INTO food_ (pkey_, food_name_ ) VALUES (?,?)" );
int nthPlaceholder = 1; // 1-based counting (not an index).
preparedStatement.setObject( nthPlaceholder++, uuid );
preparedStatement.setString( nthPlaceholder++, foodName );
// Execute SQL.
if ( !( preparedStatement.executeUpdate() == 1 ) ) {
// If the SQL reports other than one row inserted…
this.logger.error( "Failed to insert row into database." );
}
(सी) मुझे यकीन नहीं है कि आपका क्या मतलब है
<ब्लॉकक्वॉट>पोस्टग्रेज के लिए नवीनतम जावा जेडीबीसी ड्राइवर यूयूआईडी को मूल रूप से समर्थन देने का दावा करते हैं
कौन सा ड्राइवर? Postgres के लिए कम से कम दो ओपन-सोर्स JDBC ड्राइवर हैं, वर्तमान/विरासत वाला और एक नया पुनर्लेखन "अगली पीढ़ी" वाला। और अन्य वाणिज्यिक ड्राइवर भी हैं।
"मूल रूप से"? क्या आप अपने द्वारा पढ़े गए दस्तावेज़ से लिंक कर सकते हैं? SQL युक्ति में UUID (दुर्भाग्य से ) के लिए कोई डेटा प्रकार नहीं है, इसलिए JDBC युक्ति में UUID के लिए कोई डेटा प्रकार नहीं है। वर्कअराउंड के रूप में, Postgres के लिए JDBC ड्राइवर setObject
. का उपयोग करता है और getObject
रेडीस्टेडमेंट पर विधियां यूयूआईडी को जावा ↔ एसक्यूएल ↔ पोस्टग्रेज के बीच की खाई में ले जाती हैं। ऊपर उदाहरण कोड देखें।
जैसा कि रेडीडस्टेटमेंट JDBC दस्तावेज़ कहता है:
<ब्लॉकक्वॉट>यदि मनमाना पैरामीटर प्रकार रूपांतरण आवश्यक हैं, तो विधि सेटऑब्जेक्ट का उपयोग लक्ष्य SQL प्रकार के साथ किया जाना चाहिए।
शायद "मूल रूप से" द्वारा, आपने यूयूआईडी के लिए यूयूआईडी डेटा प्रकार वाले जेडीबीसी के साथ डेटा प्रकार के रूप में यूयूआईडी के लिए पोस्टग्रेस के मूल समर्थन को भ्रमित कर दिया। Postgres वास्तव में डेटा प्रकार के रूप में UUID का समर्थन करता है, जिसका अर्थ है कि मान को 128-बिट्स के रूप में संग्रहीत किया जाता है, न कि कई बार यदि इसे ASCII या यूनिकोड हेक्स स्ट्रिंग के रूप में संग्रहीत किया जाता है। और मूल निवासी होने का अर्थ यह भी है कि Postgres जानता है कि उस प्रकार के कॉलम पर एक इंडेक्स कैसे बनाया जाता है।
ऊपर उल्लिखित मेरे ब्लॉग पोस्ट की बात यह थी कि Java ↔ SQL ↔ Postgres
के बीच की खाई को पाटना कितना आसान है, इससे मुझे सुखद आश्चर्य हुआ . अपने पहले अशिक्षित प्रयासों में, मैं बहुत मेहनत कर रहा था।
UUID का समर्थन करने वाले Postgres के बारे में एक और नोट… Postgres मौजूदा UUID मानों को संग्रहीत, अनुक्रमणित और पुनर्प्राप्त करना जानता है। उत्पन्न करने के लिए UUID मान, आपको Postgres एक्सटेंशन (प्लगइन) को सक्षम करना होगा uuid-ossp
. यह एक्सटेंशन विभिन्न प्रकार के यूयूआईडी मूल्यों को उत्पन्न करने के लिए ओएसएसपी प्रोजेक्ट द्वारा प्रदान की गई लाइब्रेरी को लपेटता है। निर्देशों के लिए मेरा ब्लॉग देखें।
वैसे…
अगर मुझे पता होता कि JDBC को UUID के बारे में जागरूक करने के लिए JDBC विशेषज्ञ समूह या JSR टीम को कैसे याचिका देनी है, तो मैं निश्चित रूप से ऐसा करूँगा। वे जेएसआर 310:दिनांक और समय एपीआई में परिभाषित किए जा रहे नए दिनांक-समय प्रकारों के लिए बस यही कर रहे हैं।
इसी तरह, अगर मुझे पता था कि यूयूआईडी के डेटा प्रकार को जोड़ने के लिए एसक्यूएल मानक समिति को कैसे याचिका दायर करनी है, तो मैं करूँगा। लेकिन जाहिर तौर पर वह समिति सोवियत पोलित ब्यूरो से अधिक गोपनीय और ग्लेशियर से धीमी है।