如何使用Java Spring Framework搜索字符串LIKE'something%'?

时间:2012-06-19 15:02:05

标签: java spring jdbctemplate spring-jdbc

我有一个带有Foos的MySQL表。每个Foo都有一个数字非唯一代码和一个名称。现在我需要查找是否有任何具有某些代码的Foo恰好具有以给定字符串开头的名称。在普通的SQL中,这将是微不足道的:

select * from FOO where CODE in (2,3,5) and NAME like 'bar%';

但是我现在如何在Spring中正确地做到这一点?如果不需要'like'运算符,我会这样做:

public List<Foo> getByName(List<Integer> codes, String namePart) {
    String sql = "select * from FOO where CODE in (:codes) and NAME=:name"
    Map<String,Object> params = new HashMap<String,Object>();
    params.put("codes", codes);
    params.put("name", namePart);
    return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params);
}

但是,使用占位符代替命名参数时,使用'like'似乎没有任何效果:NAME like :name%NAME like ':name%'NAME like ?%

我可能是残酷的并且输入它

String sql = "select * from FOO where CODE in (:codes) and NAME like '"+namePart+"%'";` 

但很明显,如果Spring能够正确地清理输入参数等,那就太好了,你知道......

你认为Spring会以某种方式支持这一点,但我无法弄明白。

3 个答案:

答案 0 :(得分:27)

等等,当然,在调用它之前,我必须“再试一次”,并且看,我所有的单元测试突然通过了:

public List<Foo> getByName(List<Integer> codes, String namePart) {
    String sql = "select * from FOO where CODE in (:codes) and NAME like :name"
    Map<String,Object> params = new HashMap<String,Object>();
    params.put("codes", codes);
    params.put("name", namePart+"%");
    return getSimpleJdbcTemplate().query(sql, new FooRowMapper(), params);
}

我没想到在参数中输入“%”,我确定Spring会自动逃脱它。我想知道我做得对吗?

答案 1 :(得分:3)

要使命名参数有效,您需要使用NamedParameterJdbcTemplate

params.put(“name”,“Joe%”);

jdbcTemplate.query(“select * from FOO,其中CODE in(:codes)和NAME like:name”

答案 2 :(得分:1)

在另一种形式中,我遇到了同样的问题,我试图通过这种方式解决它:

public List<MyEntity> getMyEntityValuesBySearchText(String searchText) {

    String query = "SELECT * FROM MY_ENTITY_TABLE WHERE NAME LIKE ?";
    return this.getJdbcTemplate().query(query, new String[] { "%" + searchText + "%" },
                (rs, rowNum) -> new MyEntity(rs.getLong("PK"), rs.getString("NAME")));
}