Как искать строку LIKE 'something%' с помощью Java Spring Framework?
У меня есть таблица MySQL с Foos. Каждый Foo имеет числовой неповторимый код и имя. Теперь мне нужно найти, имеет ли какое-либо Foo с одним из определенных кодов имя, которое начинается с заданной строки. В обычном SQL это было бы тривиально:
select * from FOO where CODE in (2,3,5) and NAME like 'bar%';
Но как я правильно сделал бы это в Spring сейчас? Без необходимости для "подобного" оператора я бы сделал это следующим образом:
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 будет поддерживать это как-то, но я не могу понять это.
Ответы
Ответ 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 автоматически сбежит от него. Интересно, правильно ли я делаю это?
Ответ 2
Для того, чтобы именованные парамеры работали, вам нужно использовать NamedParameterJdbcTemplate
params.put( "name", "Joe%" );
jdbcTemplate.query( "выберите * из FOO, где CODE в (: коды) и NAME: имя"