Jdbi: Melarikan diri dari operator tanda tanya jsonb di postgres

Dibuat pada 18 Sep 2015  ·  6Komentar  ·  Sumber: jdbi/jdbi

Saya mencoba menggunakan jdbi dengan postgres dan jsonb untuk menulis kueri seperti ini:

select id, data from some_table where data ? :key

Sayangnya, jdbi menafsirkan tanda tanya ini sebagai pengganti variabel. Bagaimana saya bisa keluar dari tanda tanya sehingga saya bisa menggunakan operator tanda tanya postgres?

Komentar yang paling membantu

Ternyata ini adalah masalah hulu di jdbc. Mereka telah menerapkan cara untuk menghindarinya. Anda harus menggunakan??. Seperti:

select id, data from some_table where data ?? :key

Semua 6 komentar

Sudahkah Anda mencoba garis miring terbalik \? ?

Ya, kurasa aku seharusnya menyebutkan itu. Itu adalah insting pertama saya. Tapi saya masih mendapatkan kesalahan.

Exception in thread "main" org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: org.postgresql.util.PSQLException: No value specified for parameter 2. [statement:"select id, createdDate, data from something where data \? ?", located:"select id, createdDate, data from something where data \? ?", rewritten:"select id, createdDate, data from something where data ? ?", arguments:{ positional:{0:'pattern'}, named:{}, finder:[]}]
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1334)
    at org.skife.jdbi.v2.Query.fold(Query.java:173)
    at org.skife.jdbi.v2.Query.list(Query.java:82)
    at org.skife.jdbi.v2.Query.list(Query.java:75)
    at com.ngc.vault.eventer.Query.hasKey(Query.java:45)
    at com.ngc.vault.eventer.Main.main(Main.java:34)
Caused by: org.postgresql.util.PSQLException: No value specified for parameter 2.
    at org.postgresql.core.v3.SimpleParameterList.checkAllParametersSet(SimpleParameterList.java:228)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:163)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:615)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:465)
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:458)
    at org.skife.jdbi.v2.SQLStatement.internalExecute(SQLStatement.java:1328)
    ... 5 more

Ternyata ini adalah masalah hulu di jdbc. Mereka telah menerapkan cara untuk menghindarinya. Anda harus menggunakan??. Seperti:

select id, data from some_table where data ?? :key

Permintaan postgres
SELECT json_data FROM employee where json_data -> 'employee' @> '{"name":"Aman"}'

Kueri di atas berfungsi dengan baik saat dijalankan di postgres. Tetapi ketika dijalankan dengan jdbctemplate, itu menimbulkan kesalahan.

Kode Jawa

String sql="SELECT json_data FROM employee where json_data -> 'employee' @> '{\"name\":\"?\"}'";

List<Map<String, Object>> emp = jdbcTemplate.queryForList(sql,param);

Saat menemukan baris terakhir kode, itu menimbulkan kesalahan: - Indeks kolom di luar jangkauan: 1, jumlah kolom: 0.; pengecualian bersarang adalah org.postgresql.util.PSQLException.

Itu tidak bisa menggantikan '?' pengganti.

Itu menurut spesifikasi JDBC. ? marker tidak dikenali sebagai parameter di dalam literal string.

Jika Anda perlu menginterpolasi parameter ke dalam string JSON itu, gunakan penggabungan. Menggunakan sintaks penggabungan Postgres, kueri akan terlihat seperti:

SELECT json_data
FROM employee
WHERE json_data -> 'employee' @> ('{"name": "' || ? || '"}')

Harap perhatikan juga bahwa ini adalah proyek Jdbi, bukan JdbcTemplate. :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat