json中的JDBC Prepared语句参数

moh*_*nag 10 java postgresql jdbc

我有一个表,其数据列的结构类似于以下结构:

{"title": "some title", "objects": [{"id": "id1"}, {"id": "id2"}]}
Run Code Online (Sandbox Code Playgroud)

现在我想在数据中的对象数组中找到所有具有特定id对象的行.以下查询可从PSQL控制台完美运行:

SELECT id, data FROM table_name WHERE data->'objects' @> '[{"id": "id1"}]'
Run Code Online (Sandbox Code Playgroud)

但是我无法将其作为JDBC驱动程序的预处理语句.id的值应该是一个参数,所以我尝试将其作为传递给的字符串connection.prepareStatement(query);:

"SELECT id, data FROM table_name WHERE data->'objects' @> '[{\"id\": ?}]'"
Run Code Online (Sandbox Code Playgroud)

在这里,当我尝试设置参数时,我得到了这个异常:

org.postgresql.util.PSQLException: The column index is out of range: 1, number of columns: 0.
Run Code Online (Sandbox Code Playgroud)

当我尝试以下任何一个时,参数设置正确:

"SELECT id, data FROM table_name WHERE data->'objects' @> [{\"id\": ?}]"
"SELECT id, data FROM table_name WHERE data->'objects' @> [{'id': ?}]"
Run Code Online (Sandbox Code Playgroud)

但结果显然不是格式正确的查询:

SELECT id, data FROM table_name WHERE data->'objects' @> [{"id": 'id1'}]
SELECT id, data FROM table_name WHERE data->'objects' @> [{'id': 'id1'}]
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我得到以下异常:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "["
Run Code Online (Sandbox Code Playgroud)

在JSON中设置参数的正确语法是什么?我正在使用PostgreSql 9.5

moh*_*nag 8

我实际上是在Github上与JDBC开发人员联系,经过一些讨论后,目前最好的解决方案是将准备好的语句如下:

String query = "SELECT id, data FROM table_name WHERE data->'objects' @> ?::jsonb";
Run Code Online (Sandbox Code Playgroud)

并将整个搜索条件作为参数的字符串化JSON对象传递:

PreparedStatement st = connection.prepareStatement(query);
st.setString(1, "[\"id\":" + "id1" + "]");
st.executeQuery();
Run Code Online (Sandbox Code Playgroud)

这不是一个完美的解决方案,但由于缺乏服务器功能,似乎是最好的解决方案.最后它没有那么糟糕(理论上)没有SQL注入的风险.

关于链接的Github问题的更多细节.