2010-07-14 86 views
12

我想用MapSqlParameterSource創建一個查詢使用Like子句。春季喜歡條款

代碼是這樣的。包含它的函數接收nameParam:

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE :pname "; 

String finalName= "'%" +nameParam.toLowerCase().trim() + "%'"; 

MapSqlParameterSource namedParams= new MapSqlParameterSource(); 

namedParams.addValue("pname", finalName); 

int count= this.namedParamJdbcTemplate.queryForInt(namecount, namedParams); 

這並不正常工作,給我的地方,0-10結果之間時,我應當自收到數以千計。我基本上希望最終查詢看起來像:

SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%name%' 

但這顯然沒有發生。任何幫助,將不勝感激。

編輯:

我也曾嘗試把'%的在SQL,像

String finalName= nameParam.toLowerCase().trim(); 

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:pname%' " 

;

但這也不起作用。

回答

26

你不想在你的finalName字符串引號。使用指定的參數您不需要指定它們。這應該工作:

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE :pname "; 
String finalName= "%" + nameParam.toLowerCase().trim() + "%"; 

MapSqlParameterSource namedParams= new MapSqlParameterSource(); 
namedParams.addValue("pname", finalName); 

int count= this.namedParamJdbcTemplate.queryForInt(namecount, namedParams); 
+1

你是我的英雄。非常感謝。我一直在努力研究這一段很長的時間。 – Chris 2010-07-14 18:14:33

+2

如何接受一些被接受的答案? – Jeff 2010-07-14 19:05:26

+0

將%符號連接到參數中並將其直接放入sql查詢中的好處是什麼? SELECT count(*)FROM WHERE LOWER(NAME)LIKE'%'+:pname +'%' – 2016-07-09 02:50:41

0

你試過放置%外卡在你的SQL字符串(不綁定變量值本身):

String finalName= nameParam.toLowerCase().trim(); 
String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE '%:finalName%'"; 
+0

你可以建議一種方法來修改現有的代碼,以便我可以使用'?'佔位?我不相信你可以在MapSqlParameterSource中使用它。謝謝 – Chris 2010-07-14 14:24:17

+1

是'LIKE%:pname%'有效嗎? – 2010-07-14 14:42:13

+0

我試過了。它給了我類似的結果(可能相同)。我認爲必須使用單引號或干擾查詢的'%'符號。 – Chris 2010-07-14 14:48:31

0

我們可以用簡單的JdbcTemplate而不是NamedParamJdbcTemplate

String namecount = "SELECT count(*) FROM People WHERE LOWER(NAME) LIKE ? "; 

String finalName= "%" +nameParam.toLowerCase().trim() + "%"; //Notes: no quote 

getJdbcTemplate().queryForInt(namecount, new Object[] {finalName}); 

希望它使用的JdbcTemplate

1

該解決方案爲我工作的人很有幫助。我把對象[]參數列表中的「%」:

String sqlCommand = "SELECT customer_id, customer_identifier_short, CONCAT(RTRIM(customer_identifier_a),' ', RTRIM(customer_identifier_b)) customerFullName " 
     + " FROM Customer " 
     + " WHERE customer_identifier_short LIKE ? OR customer_identifier_a LIKE ? " 
     + " LIMIT 10"; 

List<Customer> customers = getJdbcTemplate().query(sqlCommand, new Object[] { query + "%", query + "%"}, new RowMapper<Customer>() { 

    public Customer mapRow(ResultSet rs, int i) throws SQLException { 

     Customer customer = new Customer(); 
     customer.setCustomerFullName(rs.getString("customerFullName")); 
     customer.setCustomerIdentifier(rs.getString("customer_identifier_short")); 
     customer.setCustomerID(rs.getInt("customer_id"));     

     return customer; 
    } 
}); 

return customers;