Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menggunakan Operator JSONB PostgreSQL dengan Tanda Soalan '?' dalam JDBC?

Bagaimana untuk Menggunakan Operator JSONB PostgreSQL dengan Tanda Soalan '?' dalam JDBC?

Barbara Streisand
Barbara Streisandasal
2024-12-30 02:47:28198semak imbas

How to Use PostgreSQL JSONB Operators with Question Marks

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:

  • ?: Adakah rentetan wujud sebagai kunci peringkat atas dalam nilai JSON?
  • ?|: Adakah mana-mana rentetan tatasusunan ini wujud sebagai kunci peringkat atasan?
  • ?&: Adakah rentetan tatasusunan ini wujud sebagai kunci peringkat atasan?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn