Menggunakan Operator PostgreSQL JSON(B) yang Mengandungi Tanda Soalan "?" dalam JDBC
Integrasi JDBC dengan PostgreSQL menimbulkan cabaran apabila berurusan dengan pengendali JSON yang menampilkan simbol tanda soal, seperti ? dan ?|. Pemacu PostgreSQL JDBC mentafsirkan aksara ini sebagai pembolehubah ikatan biasa dan bukannya pengendali.
Penyelesaian
Dua penyelesaian tersedia untuk menangani isu ini:
Pernyataan Statik
Pendekatan mudah ini mengelakkan penggunaan pernyataan yang disediakan. Walaupun ia menjejaskan prestasi dan keselamatan, ia menyelesaikan masalah:
try (Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
Fungsi
Pengendali dalam PostgreSQL selalunya alias untuk fungsi dalam pg_catalog. Untuk mencari fungsi asas bagi pengendali, gunakan pertanyaan berikut:
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
Pertanyaan ini akan mengembalikan hasil yang serupa dengan:
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[])
Dengan maklumat ini, anda boleh menggunakan asas fungsi bukannya pengendali:
try (PreparedStatement s = c.prepareStatement( "select jsonb_exists_any('{}'::jsonb, array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
Atas ialah kandungan terperinci Bagaimana untuk Mengendalikan Operator JSONB PostgreSQL yang Mengandungi '?' dalam JDBC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!