【问题标题】:Named parameter doesn't work with MySql LIKE statement命名参数不适用于 MySql LIKE 语句
【发布时间】:2016-04-24 09:25:52
【问题描述】:

我正在尝试使用 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());

但它也不起作用。

【问题讨论】:

    标签: java spring spring-jdbc jdbctemplate named-parameters


    【解决方案1】:

    解决办法是在参数中加上不带引号的

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

    并在 SQL 字符串中写入

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

    您的第一种方法('%:search%') 不起作用,因为在字符串文字中无法识别命名参数。

    第二种方法params.addValue("search", "'%" + search + "%'"); 不起作用,因为现在引号是like 字符串的一部分,因此要求Mysql 查找以引号开头和结尾并包含搜索词的字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 2018-07-22
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      相关资源
      最近更新 更多