查询代码及查询:
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
。
通过基本调试,我发现它的第三个绑定(bind)是问题,即
DSN like '?'
我尝试了各种变体,其中最明智的似乎是使用:
DSN like concat('%',?,'%')
但这不起作用,因为我缺少连接字符串两侧的 '
所以我尝试:
DSN like ' concat('%',Module=P_STAG_JDBC01:poolSize,'%') ' order by 2
但我似乎无法找到让他们参与其中的方法。
我错过了什么?
最佳答案
首先,PreparedStatement
占位符(那些 ?
东西)仅用于 列值,不适用于表名、列名、SQL 函数/子句等。更好用 String#format()
反而。其次,您应该不引用 '?'
之类的占位符,这只会导致最终查询的格式错误。 PreparedStatement
setter 已经为您完成了引用(和转义)工作。
这是固定的 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%");
另见:
关于java - 不能在 JDBC PreparedStatement 中使用 LIKE 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2857164/