2013-07-31 7 views
9

पोस्टग्रेस के लिए नवीनतम जावा जेडीबीसी ड्राइवर यूयूआईडी का समर्थन करने का दावा करते हैं; पोस्टग्रेस 9.2 (मैक) के खिलाफ काम करना।पोस्टग्रेस यूयूआईडी जेडीबीसी

दरअसल, जब एक प्रीपेयरस्टेटमेंट का उपयोग किया जाता है, तो मैं ड्राइवर कोड के माध्यम से कदम उठा सकता हूं, और को ABSTRJdbc3gStatement.java में विशेष 'setUuid' फ़ंक्शन के माध्यम से भी चला सकता हूं। सभी संकेतों से, इसे 'बस काम करना चाहिए'।

हालांकि, यह काम नहीं करता है।

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: uuid = bytea 
    Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. 
    Position: 139 
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2157) ~[postgresql-9.2-1002.jdbc4.jar:na] 

हाँ, वास्तव में, JDBC ड्राइवर में setUuid कि भेजता है एक bytea के रूप में:

private void setUuid(int parameterIndex, UUID uuid) throws SQLException { 
     if (connection.binaryTransferSend(Oid.UUID)) { 
      byte[] val = new byte[16]; 
      ByteConverter.int8(val, 0, uuid.getMostSignificantBits()); 
      ByteConverter.int8(val, 8, uuid.getLeastSignificantBits()); 
      bindBytes(parameterIndex, val, Oid.UUID); 
     } else { 
      bindLiteral(parameterIndex, uuid.toString(), Oid.UUID); 
     } 
    } 

क्या देता है डेटाबेस एक त्रुटि है, मैं इस प्रकार प्राप्त जो वापस flings? क्या इस रूपांतरण को आशीर्वाद देने के लिए वास्तविक डेटाबेस में कुछ जादू धावक आवश्यक है?

+1

कोशिश आप वास्तविक PreparedStatement आप को चलाने के लिए कोशिश कर रहे हैं पोस्ट कर सकते हैं? – Rafael

उत्तर

20

(ए) हमें अपना कोड दिखाएं।

(बी) कुछ ब्लॉग चर्चा और उदाहरण कोड के लिए मेरे ब्लॉग पोस्ट UUID Values From JDBC to Postgres देखें।

// 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."); 
} 

(ग) मुझे यकीन है कि आप

नवीनतम जावा JDBC चालकों द्वारा क्या मतलब postgres देशी रूप UUIDs का समर्थन करने के

कौन सा चालक का दावा के लिए नहीं कर रहा हूँ? Postgres, current/legacy one के लिए कम से कम दो ओपन-सोर्स जेडीबीसी ड्राइवर हैं और एक नया रीराइट "next generation" one है। और अन्य वाणिज्यिक ड्राइवर भी हैं।

"मूल रूप से"? क्या आप प्रलेखन से लिंक कर सकते हैं? एसक्यूएल स्पेक में UUID (दुर्भाग्य से ☹) के लिए कोई डेटा प्रकार नहीं है, इसलिए JDBC spec में यूयूआईडी के लिए कोई डेटा प्रकार नहीं है। एक कामकाज के रूप में, पोस्टग्रेज़ के लिए जेडीबीसी चालक setObject और getObject तैयार किए गए प्लेटफॉर्म पर विधियों का उपयोग यूयूआईडी को जावा ↔ एसक्यूएल ↔ पोस्टग्रेस के बीच चक्कर में ले जाता है। ऊपर उदाहरण कोड देखें।

PreparedStatement JDBC doc के रूप में कहते हैं:

मनमाना पैरामीटर प्रकार रूपांतरण के लिए आवश्यक हैं, तो विधि setObject लक्ष्य एसक्यूएल प्रकार के साथ प्रयोग किया जाना चाहिए।

शायद "मूल रूप से", आपने यूयूआईडी के लिए पोस्टग्रेस के मूल समर्थन को जेडीबीसी के साथ एक यूआईआईडी डेटा प्रकार वाले डेटा प्रकार के रूप में भ्रमित कर दिया। पोस्टग्रेस वास्तव में यूयूआईडी को डेटा प्रकार के रूप में समर्थन देता है, जिसका अर्थ यह है कि मान को कई बार के बजाय 128-बिट्स के रूप में संग्रहीत किया जाता है, यदि इसे एएससीआईआई या यूनिकोड हेक्स स्ट्रिंग के रूप में संग्रहीत किया जाता है। और देशी होने का मतलब है कि पोस्टग्रेस जानता है कि उस प्रकार के कॉलम पर एक इंडेक्स कैसे बनाया जाए।

ऊपर वर्णित मेरे ब्लॉग पोस्ट का मुद्दा यह था कि मुझे आश्चर्य हुआ कि Java ↔ SQL ↔ Postgres के बीच उस चक्कर को पुल करना कितना आसान है। मेरे पहले अशिक्षित प्रयासों में, मैं बहुत मेहनत कर रहा था।


Postgres UUID समर्थन के बारे में एक टिप्पणी ... Postgres, कैसे स्टोर सूचकांक, और मौजूदा UUID मूल्यों को पुनः प्राप्त करने को जानता है। यूयूआईडी मान उत्पन्न करने के लिए, आपको पोस्टग्रेस एक्सटेंशन (प्लगइन) uuid-ossp सक्षम करना होगा। यह एक्सटेंशन a library provided by The OSSP Project को विभिन्न प्रकार के यूयूआईडी मान उत्पन्न करने के लिए लपेटता है। my blog for instructions देखें।


वैसे ...

तो मुझे पता था कि कैसे JDBC विशेषज्ञ समूह या JSR टीम याचिका दायर करने के JDBC UUID के बारे में पता करने के लिए, मैं निश्चित रूप से होगा। वे सिर्फ JSR 310: Date and Time API में नए दिनांक-समय प्रकारों को परिभाषित करने के लिए कर रहे हैं।

इसी तरह, अगर मुझे पता था कि यूयूआईडी डेटा प्रकार जोड़ने के लिए एसक्यूएल मानकों समिति को कैसे याचिका दी जाए, तो मैं चाहता हूं। लेकिन जाहिर है कि समिति सोवियत पोलित ब्यूरो से अधिक गुप्त है और एक ग्लेशियर की तुलना में धीमी है।

PGobject toInsertUUID = new PGobject(); 
toInsertUUID.setType("uuid"); 
toInsertUUID.setValue(uuid.toString()); 
PreparedStmt stmt = conn.prepareStatement(query); 
stmt.setObject(placeHolder,toInsertUUID); 
stmt.execute(); 

इस तरह से आप प्रकार कास्टिंग करने से अपने आप को रोक दिया जाएगा:

+5

> वह समिति सोवियत पोलित ब्यूरो से अधिक गुप्त है और एक ग्लेशियर से धीमी है। ... साल की टिप्पणी !!! –

11

मैं निम्नलिखित दृष्टिकोण postgres को UUID और अन्य वस्तुओं को जोड़ने के लिए इस्तेमाल किया। कोड का यह टुकड़ा किसी भी समय मेरे लिए पूरी तरह से काम करता है उदाहरण के लिए जेसन भी।

+1

धन्यवाद। इसे एक उत्तर के रूप में चिह्नित किया जाना चाहिए। – azhidkov

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