दो संभावित समाधान हैं:
तैयार किए गए कथनों के बजाय स्थिर कथनों का उपयोग करें
यह सबसे आसान समाधान है, लेकिन आप तैयार बयानों (प्रदर्शन, एसक्यूएल इंजेक्शन सुरक्षा, आदि) से सभी लाभ खो देते हैं। हालांकि, यह काम करेगा
try (Statement s = c.createStatement();
ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
...
}
ऑपरेटर से बचें। इसके बजाय किसी फ़ंक्शन का उपयोग करें (नोट:अनुक्रमणिका का उपयोग नहीं किया जा सकता है)
ऑपरेटर pg_catalog
. में मौजूद बैकिंग फ़ंक्शन के लिए केवल सिंटैक्स शुगर हैं . यहां इन कार्यों के नाम खोजने का तरीका बताया गया है:
SELECT
oprname,
oprcode || '(' || format_type(oprleft, NULL::integer) || ', '
|| format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator
WHERE oprname = '?|';
उपरोक्त पैदावार:
oprname function
----------------------------------------------------------------------------------
?| point_vert(point, point)
?| lseg_vertical(-, lseg)
?| line_vertical(-, line)
?| jsonb_exists_any(jsonb, text[]) <--- this is the one we're looking for
?| exists_any(hstore, text[])
तो, सबसे सरल उपाय यह है कि केवल ऑपरेटर का उपयोग न करें, बल्कि इसके बजाय संबंधित फ़ंक्शन का उपयोग करें:
try (PreparedStatement s = c.prepareStatement(
"select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
ResultSet rs = s.executeQuery()) {
...
}