尝试使用预准备语句注入xmlexists
函数的字符串参数时发生错误。
Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
Connection con = DriverManager.getConnection("jdbc:derby:c:\\mydb");
PreparedStatement st = con.prepareStatement("select * from \"Data\" where xmlexists(? passing by ref \"data\")");
st.setString(1, "//*[text()[contains(., 'v1')]]");
ResultSet rs = st.executeQuery();
错误:
ERROR 42Z75: XML query expression must be a string literal.
如果语句是在没有预备语句的情况下手动构建的,则该语句会成功。
select *
from "Data"
where xmlexists('//*[text()[contains(., ''v1'')]]' passing by ref "data")
可能是什么原因?
答案 0 :(得分:1)
引自:https://db.apache.org/derby/docs/10.13/ref/rreffuncxmlexists.html
语法:
XMLEXISTS ( xqueryStringLiteral PASSING BY REF xmlValueExpression [ BY REF ] )
<强> xqueryStringLiteral 强>
必须指定为字符串文字。如果将此参数指定为参数,不是文字的表达式或不是字符串的文字(例如整数),则Derby会抛出错误。 xqueryStringLiteral参数也必须是XPath表达式。 Derby不支持完整的XQuery,只支持XPath子集。如果它无法编译或执行查询参数,则Derby会抛出SQLException。
听起来像derby不允许xmlexists
函数内的动态参数
https://db.apache.org/derby/docs/10.13/ref/rrefsqlj1083019.html