json 中的 JDBC 准备语句参数

2024-03-08

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

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


实际上,我联系了 JDBC 开发人员,网址为:Github https://github.com/pgjdbc/pgjdbc/issues/575经过一番讨论,目前最好的解决方案似乎是准备好的声明如下:

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 问题的更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

json 中的 JDBC 准备语句参数 的相关文章

随机推荐