JDBC 中如何使用包含問號「?」的PostgreSQL JSON(B) 運算子
PostgreSQL 提供了採用幾種問號作為名稱一部分的巧妙ASCII 運算符,例如這些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中文網其他相關文章!