我有一个带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 ?%使用占位符代替命名参数时。
NAME like :name%
NAME like ':name%'
NAME like ?%
我可能会残酷地输入
String sql = "select * from FOO where CODE in (:codes) and NAME like '"+namePart+"%'";`
但是显然,如果Spring可以正确地清理输入参数等,那就更好了。
您可能认为Spring会以某种方式支持这一点,但我无法弄清楚。
等待,当然,我必须在一天结束之前“再做一件事”,瞧瞧,我所有的单元测试都突然通过了:
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会自动对其进行转义。我想知道我做对了吗?