命名参数不适用于 MySql LIKE 语句
Named parameter doesn't work with MySql LIKE statement
我正在尝试使用 Spring-jdbc NamedParameterJdbcTemplate 在站点上组织搜索功能。
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());
但是也不行。
解决方法是添加不带引号的参数
params.addValue("search", "%" + search + "%");
并在SQL字符串中写入
String sql = "... like :search";
您的第一种方法 ('%:search%')
无效,因为在字符串文字中无法识别命名参数。
第二种方法 params.addValue("search", "'%" + search + "%'");
不起作用,因为现在引号是 like 字符串的一部分,因此要求 Mysql 查找以引号开头和结尾并包含搜索词的字符串.
我正在尝试使用 Spring-jdbc NamedParameterJdbcTemplate 在站点上组织搜索功能。
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());
但是也不行。
解决方法是添加不带引号的参数
params.addValue("search", "%" + search + "%");
并在SQL字符串中写入
String sql = "... like :search";
您的第一种方法 ('%:search%')
无效,因为在字符串文字中无法识别命名参数。
第二种方法 params.addValue("search", "'%" + search + "%'");
不起作用,因为现在引号是 like 字符串的一部分,因此要求 Mysql 查找以引号开头和结尾并包含搜索词的字符串.