具有以下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 '%?%'
答案 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)
答案 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());
...