首頁 > 資料庫 > mysql教程 > 如何使用帶有問號'?”的 PostgreSQL JSONB 運算符在 JDBC 中?

如何使用帶有問號'?”的 PostgreSQL JSONB 運算符在 JDBC 中?

Barbara Streisand
發布: 2024-12-30 02:47:28
原創
197 人瀏覽過

How to Use PostgreSQL JSONB Operators with Question Marks

JDBC 中如何使用包含問號「?」的PostgreSQL JSON(B) 運算子

PostgreSQL 提供了採用幾種問號作為名稱一部分的巧妙ASCII 運算符,例如這些JSON運算子:

  • ?:字串作為 JSON 值中的頂層鍵是否存在?
  • ?|:這些陣列字串中是否存在任何字串作為頂層鍵?
  • ?&:這些陣列字串作為頂層鍵是否存在?

問題在於官方 PostgreSQL JDBC 驅動程式似乎無法正確解析包含此類運算子的 SQL 字串。它認為問號是一個普通的 JDBC 綁定變數。以下程式碼...

try (
    PreparedStatement s = c.prepareStatement("select '{}'::jsonb ?| array['a', 'b']");
    ResultSet rs = s.executeQuery()) {
    ...
}
登入後複製

... 拋出例外:

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)
登入後複製

如何使用此運算子?

有兩種可能的解決方法:

1. 使用靜態語句,而不是預準備語句

這是最簡單的解決方法,但你將失去預先準備語句的所有好處(效能、SQL 注入保護等)。但是,這會起作用:

try (
    Statement s = c.createStatement();
    ResultSet rs = s.executeQuery("select '{}'::jsonb ?| array['a', 'b']")) {
    ...
}
登入後複製

2. 避免使用運算符。改用函數(注意:可能不會使用索引)

運算子只是支援函數的語法糖,該函數存在於 pg_catalog 中。以下是如何找出這些函數的名稱:

SELECT 
  oprname, 
  oprcode || '(' || format_type(oprleft,  NULL::integer) || ', ' 
                 || format_type(oprright, NULL::integer) || ')' AS function
FROM pg_operator 
WHERE oprname = '?|';
登入後複製

上面的操作產生:

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[])
登入後複製

因此,最簡單的解決方法是不使用運算符,而是使用對應的函數:

try (
    PreparedStatement s = c.prepareStatement("select jsonb_exists_any('{}'::jsonb, array['a', 'b']");
    ResultSet rs = s.executeQuery()) {
    ...
}
登入後複製

以上是如何使用帶有問號'?”的 PostgreSQL JSONB 運算符在 JDBC 中?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板