当前位置: 首页 > 知识库问答 >
问题:

JDBC在json内部准备语句参数

卫子平
2023-03-14
{"title": "some title", "objects": [{"id": "id1"}, {"id": "id2"}]}
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 "["

共有1个答案

邴俊民
2023-03-14

实际上,我联系了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注入的风险。

 类似资料:
  • Im使用具有2000多个参数标记的构建大型数据库调用。 我收到这个错误 我试着搜索API文档和google,但找不到如何配置它。 有没有人知道是否有可能达到这个限度?我知道这将是一个缓慢的数据库调用,但这是好的现在。 从长远来看,这是否会给我带来任何问题?批量运行是否会更好?

  • 问题内容: 我使用具有2000多个参数标记的大型数据库调用进行构建。 我收到这个错误 我尝试搜索API文档和Google,但是找不到如何配置它。 有谁知道是否有可能提高这个限制?我知道这将是一个缓慢的数据库调用,但是现在还可以。 从长远来看,这还会给我造成任何问题吗,我最好分批运行吗? 问题答案: 接缝处好像停留在2000年。这是驱动程序来源的一部分。 这是一个博客,其中包含有关如何解决该问题的示

  • 我一直在读一些较新的JDBC连接池(如Tomcat)不支持客户端语句池。我已经读到,这是因为大多数JDBC驱动程序都维护自己的语句缓存。然而,我不认为PostgreSQL会发生这种情况。 我说的对吗?如果是这样,我应该使用一个连接池来缓存准备好的语句,以获得最佳的批插入性能吗? 谢谢

  • 我正在为我的sqlite日志数据库使用准备好的语句。 我的线程每50ms运行一次,将日志缓冲区中的内容写入数据库。 目前,我正在对每个线程运行一个新的准备好的语句批处理,并在所有数据线写入后关闭它们。 现在我想知道是否最好将准备好的语句保存在内存中,并仅在线程关闭/中断时关闭它? 我之所以进行这种预优化,是因为我希望这个日志线程对主应用程序性能的干扰尽可能小,我可以想象每50秒分配/解析/验证资源

  • 我正在尝试使用准备好的语句和TABLE_CATALOG和table_schema的参数来选择默认模式'public'中的所有表。当我创建一个准备好的语句时,系统会返回一个错误,这没有任何意义。如果我指定了TABLE_CATALOG而不指定TABLE_SCHEMA,它可以很好地工作。另外,如果指定TABLE_SCHEMA而不指定TABLE_CATALOG,它也可以正常工作。我是不是做错什么了? 线程