无法在 JDBC 预语句中使用 LIKE 查询?

2022-09-01 06:26:49

查询代码和查询:

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

但我似乎找不到一种方法来让他们进入有效的状态。

我错过了什么?


答案 1

首先,占位符(那些东西)仅用于列值,不用于表名,列名,SQL函数/子句等。最好改用 String#format()。其次,您不应该像 这样引用占位符,它只会使最终查询格式不正确。设置者已经为您完成了引用(和转义)工作。PreparedStatement?'?'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%");

另请参阅


答案 2

如果你想在预准备语句中使用LIKE,并且还想在LIKE中使用%字符;

像往常一样写准备好的语句“ ....喜欢?...."并在将参数值分配给问号时使用

ps.setString(1, "%" + "your string value" + "%");

这将:)工作


推荐