2012-08-13 25 views
8

में ऑपरेटर शामिल हैं I पोस्टस्ट्रेएसक्यूएल 9.1.4 का उपयोग करस्टोर और PostgreSQL JDBC ड्राइवर (9.1-901.jdbc4) के साथ कर रहा हूं।हेस्टोर से बचने में जेडीबीसी तैयार कथन

मैं एक PreparedStatement में ऑपरेटरों (?, ?&, ?|) शामिल हैं उपयोग करने के लिए कोशिश कर रहा हूँ, फिर भी ? चरित्र एक चर प्लेसहोल्डर के रूप में पार्स किया गया है। क्या यह चरित्र क्वेरी में सही ऑपरेटर भेजने के लिए बच निकला जा सकता है?

एक उदाहरण:

PreparedStatement stmt = conn.prepareStatement("SELECT a, b FROM table1 WHERE c ? 'foo' AND d = ?"); 
stmt.setInt(1, dValue); 
stmt.executeQuery(); 

इस रूप में निम्न उदाहरण एक अपवाद उठाएंगे:

org.postgresql.util.PSQLException: No value specified for parameter 2. 

अद्यतन:

pgjdbc ड्राइवर this snippet में क्वेरी पार्सर की जांच करने के बाद ऐसा लगता है कि ? चरित्र से बचना संभव नहीं है। सवाल हमेशा बनी रहती हैं:

  • वहाँ JDBC कल्पना जो एक ? भाग निकले और एक पैरामीटर प्लेसहोल्डर के अलावा और कुछ हो जाने की अनुमति देता में कुछ भी है?
  • क्या इस समस्या के लिए केवल सादा स्टेटमेंट्स का उपयोग करने के बजाय क्वेरी स्ट्रिंग में मैन्युअल रूप से डाले गए चर के साथ कोई बेहतर काम है?
+0

किसी भी जेडीबीसी को नहीं जानते लेकिन 'd = $ 1' काम करता है? –

+0

नहीं, यह वैध वाक्यविन्यास नहीं है। '$ 1' पर एक वाक्यविन्यास त्रुटि फेंकता है। –

+0

कई पोस्टग्रेएसक्यूएल इंटरफेस क्रमांकित प्लेसहोल्डर्स (यानी '$ 1',' $ 2', ...) पसंद करते हैं, मुझे लगता है कि जेडीबीसी उनमें से एक नहीं है। –

उत्तर

5

प्रभावी रूप से, ऐसा लगता है कि जावा एसक्यूएल पार्सर अनुपालन नहीं कर रहा है।

लेकिन चूंकि वाक्यविन्यास c ? 'foo'exist(c, 'foo') के बराबर है, तो आप आसानी से इस समस्या का समाधान कर सकते हैं। वर्बोज़ हैस्टोर के लिए ऑपरेटरों को देखने के लिए निम्न पृष्ठ पर एक नज़र डालें।

Postgres hstore documentation

+0

धन्यवाद, मैंने वहां वर्बोज ऑपरेटर नहीं देखा था। –

+7

यह ध्यान रखना महत्वपूर्ण है कि 'मौजूद है (सी,' foo ') * सूचकांक का उपयोग नहीं करता है। अंतर देखने के बिना और बिना किसी प्रश्न योजना की जांच करें। – magneticMonster

+2

यह विधि JSONB कॉलम के लिए भी काम नहीं करती है। – expert

-1

आप PreparedStatement का उपयोग कर कई कुंजी-मान जोड़ों जोड़ना चाहते हैं, तो आप कर सकते हैं:

PreparedStatement ps = c.prepareStatement(
        "insert into xyz(id, data) values(?, hstore(?, ?))"); 

ps.setLong(1, 23456L); 
ps.setArray(2, c.createArrayOf("text", new String[]{"name", "city"})); 
ps.setArray(3, c.createArrayOf("text", new String[]{"Duke", "Valley"})); 

यह दर्ज हो जाएगा: 23456, 'name=>Duke, city=>Valley'

+0

इसमें इस सवाल के साथ कुछ भी नहीं है –

2

इस बारे में चर्चा भी नहीं है pgsql-hackers मेलिंग सूची पर समस्या: http://grokbase.com/t/postgresql/pgsql-hackers/1325c6ys9n/alias-hstores-to-so-that-it-works-with-jdbc

अब के लिए मुझे यह सबसे अधिक पसंद है nd जो इंडेक्स का भी समर्थन करता है:

CREATE FUNCTION exist_inline (hstore, text) RETURNS bool AS $$ SELECT $1 ? $2; $$ LANGUAGE sql;