java - 不能在 JDBC PreparedStatement 中使用 LIKE 查询?

标签 java oracle jdbc sql-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

通过基本调试,我发现它的第三个绑定(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/

相关文章:

java - 摆脱枚举中的代码重复

java - 限制 Reactor Flux 读取 Mongodb 集合的吞吐量

java - 如何让多个 jComboBox 具有相同的项目,但选择一项会使该项目在所有其他 jComboBox 中消失?

java - 禁用 jmx SSL

oracle - 如何在 Oracle 中向日期添加间隔

sql - Oracle始终获取具有标识的插入行的ID

java - JDBC PreparedStatement Batch 在出错时继续插入

java - 使用 Jackson 和 JavaTimeModule 序列化 Java 8 ZonedDateTime

java - 使用 Java 查询从数据库中选择值并将它们用作变量并将其插入另一个表中

java - 无法从 JTable 数据库获取数据到 JTextField