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
我实际上是在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问题的更多细节.
归档时间: |
|
查看次数: |
2092 次 |
最近记录: |