2016-05-24 10 views
8

अंदर तैयार बयान पैरामीटर मैं एक मेज जो एक संरचना के साथ एक डेटा स्तंभ निम्न के समान है है डेटा के अंदर क्वेरी के बाद psql कंसोल से पूरी तरह से काम करता है:JDBC json

SELECT id, data FROM table_name WHERE data->'objects' @> '[{"id": "id1"}]' 

लेकिन मैं इस JDBC ड्राइवर पर एक तैयार बयान के रूप में काम करने के लिए नहीं मिल सकता है। आईडी के लिए मूल्य एक पैरामीटर होना चाहिए, तो मैं स्ट्रिंग कि connection.prepareStatement(query); को पारित कर दिया है के रूप में इस की कोशिश की:

org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0. 

जब मैं:

"SELECT id, data FROM table_name WHERE data->'objects' @> '[{\"id\": ?}]'" 
यहाँ

जब मैं तर्क स्थापित करने के लिए मैं इस अपवाद कोशिश कोशिश निम्नलिखित तर्क के किसी भी ठीक से सेट है:

"SELECT id, data FROM table_name WHERE data->'objects' @> [{\"id\": ?}]" 
"SELECT id, data FROM table_name WHERE data->'objects' @> [{'id': ?}]" 

लेकिन परिणाम स्पष्ट रूप से उचित रूप से स्वरूपित क्वेरी नहीं है:

+०१२३५१६४१०६१
SELECT id, data FROM table_name WHERE data->'objects' @> [{"id": 'id1'}] 
SELECT id, data FROM table_name WHERE data->'objects' @> [{'id': 'id1'}] 

दोनों ही मामलों में मैं अपवाद निम्नलिखित हो:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "[" 

JSON के अंदर एक पैरामीटर सेट करने के लिए सही सिंटैक्स क्या है? मैं PostgreSQL 9.5

+0

एसक्यूएल में स्ट्रिंग्स एकल उद्धरणों द्वारा सीमित हैं, डबल कोट्स – Leo

+0

आईडी का चयन करें, table_name से डेटा कहां डेटा -> 'ऑब्जेक्ट्स' @>? कहा पे ? है [{"id": "id1"}] – Leo

+0

यह सुनिश्चित नहीं है कि आप किसके लिए हैं, लेकिन उन छोड़े गए हैं जावा स्ट्रिंग्स को 'कनेक्शन.prepareStatement' – mohamnag

उत्तर

6

उपयोग कर रहा हूँ मैं वास्तव में Github पर अधिक JDBC डेवलपर्स तक पहुंचा और कुछ विचार विमर्श के बाद ऐसा लगता है वर्तमान में सबसे अच्छा समाधान के रूप में निम्नानुसार तैयार बयान है कि:

String query = "SELECT id, data FROM table_name WHERE data->'objects' @> ?::jsonb"; 

और पास पैरामीटर के लिए stringified JSON ऑब्जेक्ट के रूप में पूरे खोज मापदंड:

PreparedStatement st = connection.prepareStatement(query); 
st.setString(1, "[\"id\":" + "id1" + "]"); 
st.executeQuery(); 

thats नहीं एक आदर्श समाधान लेकिन सर्वर क्षमताओं की कमी के कारण सबसे अच्छा संभव लगता है। अंत में यह इतना बुरा नहीं है क्योंकि सैद्धांतिक रूप से एसक्यूएल इंजेक्शन का कोई खतरा नहीं है।

लिंक किए गए गिथब मुद्दे पर अधिक जानकारी।

+0

आपके निष्कर्ष को साझा करने के लिए धन्यवाद। मैं एक ही दृष्टिकोण ले रहा था। –

+0

कोई समस्या नहीं, यह एक बहुत ही लोकप्रिय समस्या प्रतीत होती है और सबसे अच्छा समाधान सर्वर पक्ष पर चयनकर्ताओं का एक बड़ा सेट है। उम्मीद है कि पोस्टग्रेस पर लोग हमें सुनेंगे। – mohamnag