当前位置: 首页 > 面试题库 >

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

屈昊天
2023-03-14
问题内容

查询代码和查询:

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教程:使用准备好的语句
  • 格式字符串语法


 类似资料:
  • 我正在Windows 2012R2上运行MySQL 5.6.26,在MySQL.ini中,所有内容都配置为使用UTF-8 Unicode(utf8)。 当我执行以下SQL命令时: 数据库返回给我以下数据: 118威尼斯3 5 0 56

  • 问题内容: 在命名查询的where子句中可能有一个like?我正在尝试执行以下操作,但出现异常 我尝试像在普通SQL中那样添加%,但是得到了异常编译。 任何指针,不胜感激! 谢谢 问题答案: 您不能在中添加%,但可以在为其分配参数的值中包含它。 如:

  • 问题内容: 我已经阅读了有关如何编写这些查询的多个示例,但是我正在努力使此特定代码像在使用时运行 这是匹配以a开头的用户名的正确方法吗? 问题答案: 不,您不需要内部单引号 您现在正在运行的语句将尝试匹配而不是匹配 bindParam将确保在将所有字符串数据提供给SQL语句时自动正确引用。

  • 问题内容: 可以说我有这样的第一张桌子 分支表 第二张桌子是这样的 余额表 我想查询余额表,其中每一行包含分支表的名称。例如分支表中的“ 123456ABC”,我想从余额表中获取“ ABC”行 我怎样才能做到这一点?到目前为止,我还没有尝试过这个查询 有什么建议吗? 问题答案: 你应该 转换 了的名称模式: 联接看起来更易读:

  • 问题内容: 我如何在hibernate中使用。我想在文件中使用SQL 。我有2个查询,我要合并为1个。 查询如下所示: 我也试过了。我使用了不带like子句的方法,它起作用。但是不起作用。 包装的异常: 这就是我传递参数的方式: 试过|| 并得到以下异常: 问题答案: 也许user_id不是char / varchar?您必须先将带有str()的user_id转换为字符数据! 例:

  • 主要内容:带有“%”通配符的查询,带有“_”通配符的查询,LIKE 区分大小写,使用通配符的注意事项和技巧在 MySQL 中, LIKE 关键字主要用于搜索匹配字段中的指定内容。其语法格式如下: [NOT] LIKE  '字符串' 其中: NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。 字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。 LIKE 关键字支持百分号“%”和下划线“_”通配符。 通配符是一种特殊语句,主要用来模糊查询。当不知道真正