一尘不染

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

java

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

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

但是我现在如何在春季正确地做到这一点?不需要’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);
}

然而,与“喜欢”似乎没有任何工作:NAME like :name%NAME like ':name%'NAME like ?%使用占位符代替命名参数时。

我可能会残酷地输入

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

但是显然,如果Spring可以正确地清理输入参数等,那就更好了。

您可能认为Spring会以某种方式支持这一点,但我无法弄清楚。


阅读 317

收藏
2020-12-03

共1个答案

一尘不染

等待,当然,我必须在一天结束之前“再做一件事”,瞧瞧,我所有的单元测试都突然通过了:

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会自动对其进行转义。我想知道我做对了吗?

2020-12-03