json中的JDBC Prepared语句参数

时间:2016-05-24 20:05:33

标签: java postgresql jdbc

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

{"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

1 个答案:

答案 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问题的更多细节。