像%?%不能作为StringBuilder SQL查询的一部分

时间:2011-03-21 15:03:52

标签: java sql string sql-like

具有以下String构建的SQL查询:

    StringBuilder querySelect = new StringBuilder("select * from messages ");
    StringBuilder queryWhere = new StringBuilder("where msg_id=?");

        if (fileRSVO.getFileName()!= null){
            queryWhere.append("and descr LIKE %?% ");
        }
querySelect.append(queryWhere);

    List<Map<String, Object>> list = getJdbcTemplate().queryForList(querySelect.toString(), params.toArray()); 
    ...

问题出在这一部分:

queryWhere.append("and descr LIKE %?% ")

LIKE不起作用。
检查调试 - 它已添加到所有查询中 它应该是单引号还是其他技巧?

感谢。

EDITED

尝试使用单引号:queryWhere.append("and descr LIKE '%?%' ") 不起作用

这是调试字符串:

select * from messages where msg_id=? and descr LIKE '%?%' 

9 个答案:

答案 0 :(得分:4)

假设查询是使用PreparedStatement运行的,问题可能是queryForList调用setString(1, 'some descr')。这会将SQL解析为"... and descr LIKE %'some descr'%"

尝试将代码更改为:

queryWhere.append("and descr LIKE ?");
...
.setString(1, "%some descr%")

答案 1 :(得分:3)

你可以尝试这样做,看看有什么变化。

queryWhere.append("and descr LIKE '%?%' ") 

答案 2 :(得分:3)

?不是文本替换的占位符,它是一个参数(即它就像Java中的变量一样),因此它应该被视为一个单独的标记。这应该有效,但可能不适用于所有数据库:

queryWhere.append("and descr LIKE ('%' || ? || '%')"); 

另外,您可以将%作为参数值的一部分传递,如Justin Muller所建议。

答案 3 :(得分:2)

你想要做

queryWhere.append("AND descr LIKE'%?%'");

我用单引号包裹%?%。

要查看更多LIKE查询示例,请结帐this

答案 4 :(得分:2)

我总是接受参数并将%放入参数中,然后将其绑定到and descr like ?

答案 5 :(得分:0)

StringBuilder querySelect = new StringBuilder("select * from messages");
StringBuilder queryWhere = new StringBuilder("where msg_id=?");
if (fileRSVO.getFileName()!= null){
  queryWhere.append("and descr LIKE %?% ");
}
// query = "select * from messageswhere msg_id=?and descr LIKE %?% "

如您所见,查询无效。您必须添加空格:

StringBuilder querySelect = new StringBuilder("select * from messages ");
StringBuilder queryWhere = new StringBuilder("where msg_id=? ");
if (fileRSVO.getFileName()!= null){
  queryWhere.append("and descr LIKE %?% ");
}
// query = "select * from messages where msg_id=? and descr LIKE %?% "

关于部分:descr LIKE%?%

我不确定这是如何传递到数据库的。只是“按原样”,或作为需要填写的第二个参数。 如果“按原样”,?被视为外卡并且所有结果都被拍摄。 如果没有,第二个?没有填写(正确)。尝试使用:

descr LIKE ?

在java代码中添加值之前和之后的%。

答案 6 :(得分:0)

如果您可以选择使用third party library to manage dynamic SQL,这是使用jOOQ的解决方案(免责声明:我为供应商工作)

ctx.selectFrom(MESSAGES)
   .where(MESSAGES.MSG_ID.eq(msgId))
   .and(fileRSVO.getFileName() != null
      ? MESSAGES.DESCR.contains(descr)
      : DSL.noCondition())
   .fetch();

这是使用Field.contains(T)方法的,它转换为:

[ field ] like ('%' || escape(value, '\') || '%') escape '\'

请注意escape()的用法,如果您的字符串包含通配符,则必须这样做。当然,另一种选择是连接Java中已经存在的通配符:

ctx.selectFrom(MESSAGES)
   .where(MESSAGES.MSG_ID.eq(msgId))
   .and(fileRSVO.getFileName() != null
      ? MESSAGES.DESCR.like("%" + descr + "%")
      : DSL.noCondition())
   .fetch();

答案 7 :(得分:0)

功能性功能

             sql.append(" AND VNOMBRE LIKE :P_VNOMBRE");
             parametros.addValue("P_VNOMBRE", "%"+oficinas.getCAJABUSQUEDA()+"%");

         

答案 8 :(得分:-1)

使用此代码:

StringBuilder querySelect = new StringBuilder("select * from messages ");
StringBuilder queryWhere = new StringBuilder("where msg_id=?");

if (fileRSVO.getFileName()!= null){
    queryWhere.append("and descr LIKE %?% ");
}
querySelect.append(queryWhere);

List<Map<String, Object>> list = getJdbcTemplate().queryForList(querySelect.toString(), params.toArray()); 
...