2011-03-21 24 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