我有一个表格,其数据列的结构类似于以下结构:
{"title": "some title", "objects": [{"id": "id1"}, {"id": "id2"}]}
现在我想在数据中的对象数组中找到所有具有特定id对象的行。以下查询可从PSQL控制台完美运行:
SELECT id, data FROM table_name WHERE data->'objects' @> '[{"id": "id1"}]'
然而,我无法将其作为JDBC驱动程序的预备语句。 id的值应该是一个参数,所以我尝试将其作为传递给connection.prepareStatement(query);
的字符串:
"SELECT id, data FROM table_name WHERE data->'objects' @> '[{\"id\": ?}]'"
这里当我尝试设置参数时,我得到了这个例外:
org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0.
当我尝试以下任何一项时,参数设置正确:
"SELECT id, data FROM table_name WHERE data->'objects' @> [{\"id\": ?}]"
"SELECT id, data FROM table_name WHERE data->'objects' @> [{'id': ?}]"
但结果显然不是格式正确的查询:
SELECT id, data FROM table_name WHERE data->'objects' @> [{"id": 'id1'}]
SELECT id, data FROM table_name WHERE data->'objects' @> [{'id': 'id1'}]
在这两种情况下我都会遇到以下异常:
org.postgresql.util.PSQLException: ERROR: syntax error at or near "["
在JSON中设置参数的正确语法是什么? 我正在使用PostgreSql 9.5
答案 0 :(得分:7)
我实际上是在Github与JDBC开发人员联系,经过一些讨论后,目前最好的解决方案是准备好如下语句:
String query = "SELECT id, data FROM table_name WHERE data->'objects' @> ?::jsonb";
并将整个搜索条件作为参数的字符串化JSON对象传递:
PreparedStatement st = connection.prepareStatement(query);
st.setString(1, "[\"id\":" + "id1" + "]");
st.executeQuery();
这不是一个完美的解决方案,但由于缺乏服务器功能,似乎是最好的解决方案。最后它没有那么糟糕(理论上)没有SQL注入的风险。
关于链接Github问题的更多细节。