【问题标题】:JDBC prepared statement to query JSON using json_exists使用 json_exists 查询 JSON 的 JDBC 准备语句
【发布时间】:2018-02-21 19:12:23
【问题描述】:

我在将以下查询转换为 jdbc 准备语句并设置参数时遇到了麻烦。

oracle 查询:

select * from TRANSACTION_DUMMY where ID = 'aa'
and JSON_EXISTS(TRANSACTION_DUMMY_INDEX FORMAT JSON, 
 '$.header.lineItems[*].status?(@=="complete")')

翻译查询:

select * from TRANSACTION_DUMMY where ID = ?
and JSON_EXISTS(TRANSACTION_DUMMY_INDEX FORMAT JSON, 
'$.header.lineItems[*].status?(@==?)')

问题是如何在查询中设置参数。 尝试使用索引,但总是得到错误,无效的列索引。

任何指针如何使用java jdbc准备好的语句来处理上述场景?

谢谢

【问题讨论】:

  • 你试过的代码是什么?
  • 乍一看你可能需要转义status?中的?。这是您原始查询的一部分,但 jdbc 会将其视为参数,因此当您只需要两个参数时,您有三个参数
  • @Adam - 那个问号,以及等号后面的那个 - 大概是 OP 试图绑定的那个,因此抛出了错误 - 应该被忽略,因为它们在一个单引号字符串,被视为文本文字,不被解释。
  • @AlexPoole:啊!所以,这两个问号需要区别对待,但我改错了:)

标签: java json oracle jdbc


【解决方案1】:

根据the documentationJSON_EXISTS 的第二个参数是一个特殊的字符串字面量,称为JSON_path_expression

如果表达式的值应该动态更改,最简单的方法是在客户端 (Java) 端创建它,然后将其连接到查询中。您不能将路径表达式作为绑定变量传递,因为 Oracle 期望它是文字,即“解析时常量”。如您所见,如果您尝试将表达式作为绑定值传递,您将收到 ORA-40454: path expression not a literal 错误消息。

以下代码使用 Java 的 String.format() 将表达式注入 SQL 模板:

String sql = "select * from TRANSACTION_DUMMY where ID = 'aa' "
            + "and JSON_EXISTS(TRANSACTION_DUMMY_INDEX_FORMAT_JSON, %s)";
// here you could have some code for modifying jsonPathExpression dynamically, 
// e.g. changing the status based on some criteria
String jsonPathExpression = "'$.header.lineItems[*].status?(@==\"complete\")'";

try (Statement st = myConnection.createStatement(String.format(sql, jsonPathExpression))) {

    ResultSet st = ps.executeQuery();
    // Process result set
}

【讨论】:

  • 上面的方法试过了,还是java.sql.SQLException: Invalid column index
  • 您能否分享有关您的问题的更多详细信息 - 如何您是如何尝试的?错误是否可能是由您的代码中的ResultSet 处理引起的(在我的示例中省略了)?
  • 其实'java.sql.SQLException: Invalid column index'原来的问题已经解决了。运行上述示例会导致“ORA-40454:路径表达式不是文字”。对造成的混乱表示歉意。
  • 现在修改解决方案;显然,您不能将绑定变量与 JSON_EXISTS 函数一起使用。您基本上需要将其连接到查询中,但您当然可以在 Java 中以某种方式动态创建表达式值。
  • 要检查的状态将是函数的输入。在 pathExpression 中连接它并在 createStatement 中使用 to 是不对的。我们可能会对 sqlinjection 开放。反过来,可以在 json 索引上构建一个视图并查询该视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2011-05-02
  • 2014-07-11
  • 2018-04-10
  • 1970-01-01
相关资源
最近更新 更多