JDBC预处理语句使用json_exists

时间:2018-02-21 19:12:23

标签: java json oracle jdbc

我很难将以下查询转换为jdbc prepared语句并设置参数。

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 prepared statement处理上述场景?

感谢

1 个答案:

答案 0 :(得分: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
}