2016-04-24 30 views
2

我想在網站上使用Spring-jdbc NamedParameterJdbcTemplate組織搜索功能。命名參數不能與MySql LIKE語句一起使用

public List<PhoneEntry> searchPhoneEntries(String search, String username) { 

    String SQL = "select * from entries, users where users.enabled=true " + 
      "and entries.username=:username " + 
      "and concat(secondName, firstName, patronymic, mobile, tel, " + 
      "address, entries.email) like ('%:search%')"; 
    MapSqlParameterSource params = new MapSqlParameterSource(); 
    params.addValue("username", username); 
    params.addValue("search", search); 
    return jdbcTemplate.query(SQL, params, new PhoneEntryMapper()); 
} 

但是我得到一個空的列表並且沒有任何錯誤。

當使用一個簡單的串聯:

"...like '%" + search + "%'"; 

它正常工作,但據我所知它是不是安全。

我試着也在參數添加 '%' 符號:

MapSqlParameterSource params = new MapSqlParameterSource(); 
params.addValue("username", username); 
params.addValue("search", "'%" + search + "%'"); 
return jdbcTemplate.query(SQL, params, new PhoneEntryMapper()); 

但它不工作過。

回答

1

解決的辦法是添加參數不帶引號

params.addValue("search", "%" + search + "%"); 

,並在SQL字符串寫入

String sql = "... like :search"; 

你的第一種方法('%:search%')沒有工作,因爲命名的參數沒有下識別字符串文字。

第二種方法params.addValue("search", "'%" + search + "%'");由於現在引號是類似字符串的一部分,因此要求Mysql查找以引號開頭和結尾幷包含搜索詞的字符串。

+0

是的,它的工作原理!謝謝! –