发布于 2022-03-16 09:48:44
只要更正错误,就可以在JSON_EXISTS函数调用中忘记终止字符串文字,然后?将在字符串中,而JDBC将不将其解析为绑定参数。
如果由于某种原因,纠正错误不够,那么:
来自OJDBC文档 (这与与问题链接的文档有细微差别):
A.4.4
MATCH_RECOGNIZE条款?字符在OracleDatabase11g和更高版本的MATCH_RECOGNIZE子句中用作令牌。由于JDBC标准将?字符定义为参数标记,因此JDBC驱动程序和Server引擎无法区分相同令牌的不同用途。 在早期版本的JDBC驱动程序中,如果希望将?字符解释为MATCH_RECOGNIZE令牌而不是参数标记,则必须使用Statement而不是PreparedStatement,并禁用转义处理。但是,从OracleDatabase12c第1版(12.1.0.2)开始,您可以在使用'{\\ ... \\}'字符时使用?语法,这样JDBC驱动程序就不会将其作为参数标记处理,并允许SQL引擎处理它。
在此之后,我认为您的代码(纠正不关闭字符串文字并在JSON路径表达式中缺少一个结束括号的错误)应该如下:
String sql =
"SELECT * "
+ "FROM TEST_JSON2 "
+ "WHERE JSON_EXISTS(json_data, {\\'$?(@[*] == ?)'\\})";
PreparedStatement ps = conn.prepareStatatement(sql);
ResultSet rs = ps.executeQuery();或者,不使用PreparedStatement而只使用Statement
String sql =
"SELECT * "
+ "FROM TEST_JSON2 "
+ "WHERE JSON_EXISTS(json_data, '$?(@[*] == ?)')";
Statement s = conn.createStatatement(sql);
ResultSet rs = s.executeQuery();https://stackoverflow.com/questions/71494412
复制相似问题