Spring Like子句

时间:2010-07-14 13:54:39

标签: java spring jdbc

我正在尝试使用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%' "

但这也不起作用。

4 个答案:

答案 0 :(得分: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 :(得分:1)

这个解决方案对我有用。我把"%"在Object []参数列表中:

    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;

答案 2 :(得分:0)

您是否尝试将%通配符放在sql字符串中(而不是绑定变量值本身):

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

答案 3 :(得分: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

的人有所帮助