Подтвердить что ты не робот

Как искать строку 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 будет поддерживать это как-то, но я не могу понять это.

4b9b3361

Ответ 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: имя"