2011-03-21 58 views
1

有下列字符串建立SQL查询:像%%不作为StringBuilder的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 '%?%' 

回答

3

?不是文本替换的占位符,它是一个参数(即它像Java中的变量),因此它应该被视为单独的标记。这应该工作,但也许不是在所有的数据库:

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

Alternativelty你可以通过% S作为参数值的部分,由贾斯汀·穆勒的建议。

+0

queryWhere.append(“和descr LIKE'%”+ fileRSVO.getFileName()+“%'”) - 它是,无论如何你的方向是正确的 – sergionni 2011-03-21 20:18:04

+0

@serionni:这是一个非常糟糕的解决方案,它很容易受到SQL注入。使用我的解决方案(在数据库端添加'%'s)或Justin Muller的(在将'fileRSVO.getFileName()'放入'params'时添加'%'s)。 – axtavt 2011-03-21 20:29:11

+0

@sergionni:注意纠正,这种方式应该更符合数据库。 – axtavt 2011-03-21 20:35:32

3

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

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

只是检查... MVN是如此slooow – sergionni 2011-03-21 15:10:54

+0

我希望工程 – futile 2011-03-21 15:18:19

+0

遗憾的是,目前还没有,看看,请,编辑部分 – sergionni 2011-03-21 15:20:22

2

你会想要做

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

我裹%?%的单引号。

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

+0

奇怪,不适用于单引号。调试:从消息中选择*,其中msg_id =?和descr LIKE'%?%' – sergionni 2011-03-21 15:18:38

4

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

尝试改变代码:

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

对不起,不太明白,我应该在哪里做setSetring()? – sergionni 2011-03-21 15:25:02

+0

我猜在queryForList(String,Array)方法的某个地方调用了setString(int,String)。 – 2011-03-21 18:44:38

2

我始终以参数并把%到参数,然后将其绑定到and descr like ?

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%%

我并不很清楚这是怎么throught传递到数据库?只是“按原样”,或者作为需要填写的第二个参数。 如果“原样”,那么?被视为通配符,并且所有结果都被采纳。 如果不是,第二?没有填写(正确)。尝试使用:

descr LIKE ? 

并在您的java代码中添加值前后的值。

+0

那里有空格,它是我查询的简化示例 – sergionni 2011-03-21 15:28:15

+0

试过LIKE%?%,LIKE? , 喜欢 '%?%'。没有任何工作。 – sergionni 2011-03-21 15:29:56

-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()); 
... 
+1

这段代码与我的初始代码有什么不同? – sergionni 2012-08-20 12:23:09