2016-04-24 97 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

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