gpt4 book ai didi

java - 使用 json_exists 查询 JSON 的 JDBC 准备语句

转载 作者:行者123 更新时间:2023-12-02 11:36:16 25 4
gpt4 key购买 nike

我在将以下查询转换为 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 准备语句处理上述场景?

谢谢

最佳答案

根据the documentationJSON_EXISTS 的第二个参数是一个名为 JSON_path_expression 的特殊字符串文字。

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

以下代码使用 Java 的 String.format() 将表达式注入(inject)到 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 - 使用 json_exists 查询 JSON 的 JDBC 准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48913687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com