不能在JDBC PreparedStatement中使用LIKE查询?
查询代码和查询:
ps = conn.prepareStatement("select instance_id, ? from eam_measurement where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where resource_group_id = ?) and DSN like '?' order by 2");ps.setString(1,"SUBSTR(DSN,27,16)");
ps.setInt(2,defaultWasGroup);
ps.setString(3,"%Module=jvmRuntimeModule:freeMemory%");
rs = ps.executeQuery();
while (rs.next()) { bla blah blah blah ...
返回一个空值ResultSet
。
通过基本调试,我发现了它的第三个绑定,即问题
DSN like '?'
我尝试了各种变体,其中最明智的似乎是在使用:
DSN like concat('%',?,'%')
但这不起作用,因为我错过'
了连接字符串的任一侧,所以我尝试:
DSN like ' concat('%',Module=P_STAG_JDBC01:poolSize,'%') ' order by 2
但我似乎无法找到一种方法使它们起作用。
我想念什么?
回答:
首先,PreparedStatement
占位符(那些占位符?
)仅用于
,而不用于表名,列名,SQL函数/子句等。最好String#format()
改用。其次,你应该
引用占位符一样'?'
,它只会malform最终的查询。的PreparedStatement
制定者已经做了引用(和转义)的工作适合你。
这是固定的SQL:
private static final String SQL = "select instance_id, %s from eam_measurement" + " where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where"
+ " resource_group_id = ?) and DSN like ? order by 2");
使用方法如下:
String sql = String.format(SQL, "SUBSTR(DSN,27,16)"); // This replaces the %s.preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, defaultWasGroup);
preparedStatement.setString(2, "%Module=jvmRuntimeModule:freeMemory%");
:
- Sun JDBC教程:使用准备好的语句
- 格式字符串语法
以上是 不能在JDBC PreparedStatement中使用LIKE查询? 的全部内容, 来源链接: utcz.com/qa/402547.html