Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menggunakan Operator JSONB PostgreSQL dengan Tanda Soalan '?' dalam JDBC?
Bagaimana untuk menggunakan operator PostgreSQL JSON(B) yang mengandungi tanda soal "?" dalam JDBC
PostgreSQL menyediakan beberapa kaedah yang menggunakan tanda soal sebagai nama Sebahagian daripada operator ASCII yang bijak, seperti JSON ini Operator:
Masalahnya ialah pemacu PostgreSQL JDBC rasmi nampaknya tidak dapat menghuraikan rentetan SQL yang mengandungi pengendali sedemikian dengan betul. Ia menganggap tanda soal sebagai pembolehubah ikatan JDBC biasa. Kod berikut...
try ( PreparedStatement s = c.prepareStatement("select '{}'::jsonb ?| array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
... membuang pengecualian:
org.postgresql.util.PSQLException: Für den Parameter 1 wurde kein Wert angegeben. at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:225) at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:424) at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:161) at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:114)
Bagaimana untuk menggunakan operator ini?
Terdapat dua penyelesaian yang mungkin:
1 Gunakan pernyataan statik dan bukannya pernyataan yang disediakan
Ini adalah penyelesaian yang paling mudah, tetapi anda. akan kehilangan semua manfaat kenyataan yang disediakan (prestasi, perlindungan suntikan SQL, dsb.). Walau bagaimanapun, ini akan berfungsi:
try ( Statement s = c.createStatement(); ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) { ... }
2. Elakkan menggunakan operator. Gunakan fungsi sebaliknya (nota: pengindeksan mungkin tidak digunakan) Pengendali
hanyalah gula sintaktik untuk fungsi yang disokong, yang wujud dalam pg_catalog. Begini caranya untuk mencari nama fungsi ini:
SELECT oprname, oprcode || '(' || format_type(oprleft, NULL::integer) || ', ' || format_type(oprright, NULL::integer) || ')' AS function FROM pg_operator WHERE oprname = '?|';
Operasi di atas menghasilkan:
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[])
Jadi penyelesaian yang paling mudah ialah bukan menggunakan operator, tetapi Fungsi yang sepadan:
try ( PreparedStatement s = c.prepareStatement("select jsonb_exists_any('{}'::jsonb, array['a', 'b']"); ResultSet rs = s.executeQuery()) { ... }
Atas ialah kandungan terperinci Bagaimana untuk Menggunakan Operator JSONB PostgreSQL dengan Tanda Soalan '?' dalam JDBC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!