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
Lepaskan: 2024-12-30 02:47:28
asal
233 orang telah melayarinya

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()) {
    ...
}
Salin selepas log masuk

... 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)
Salin selepas log masuk

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']")) {
    ...
}
Salin selepas log masuk

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 = '?|';
Salin selepas log masuk

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[])
Salin selepas log masuk

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()) {
    ...
}
Salin selepas log masuk

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 Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan