Повторно использовать параметр sql, когда не используются именованные параметры
У меня есть запрос, который вызывается с помощью JdbcTemplate, но отправляется только один параметр, и мне нужно использовать этот один параметр в двух случаях.
Запрос
String sql = "select * from employee where salary > ? and netpay > ?";
Вызов
Парам здесь только один. IE, если идентификатор TEST123
запрос должен быть
select * from employee where id = TEST123 and name = TEST123
хотя один параметр проходит мимо.
getJdbcTemplate().query(sql, new Object[]{"TEST123"}, CustomResultSetExtractor());
Есть ли способ сделать это со стороны запроса вместо передачи двух параметров?
НОТА
У меня нет доступа для изменения способа вызова запроса, поэтому я не могу добавить именованные параметры или просто передать дополнительный параметр.
3 ответа
Используйте NamedParameterJdbcTemplate, оболочку JdbcTemplate:
Шаблонный класс с базовым набором операций JDBC, позволяющий использовать именованные параметры вместо традиционных '?' заполнители.
Этот класс делегирует обернутую JdbcTemplate после замены именованных параметров на стиль JDBC '?' заполнители делается во время исполнения.
Ваш SQL будет с 1 параметром:
select * from employee where id = (:id) and name = (:id)
И код будет:
MapSqlParameterSource args = new MapSqlParameterSource();
args.addValue("id", TEST123);
return new NamedParameterJdbcTemplate(getJdbcTemplate()).query(sql , args, youRowMapper);
Если вы не можете изменить его, вы можете изменить свой запрос на:
select * from employee where id = ? and id = name
Я поражен, что вы не нашли:
String sql = "select * from employee where id = ? and name = id";
Или ты имел ввиду or
вместо and
?
String sql = "select * from employee where ? in (id, name)";
Я хотел бы предложить что-то еще, вы можете повторить свой параметр в массиве объектов, например, если ваш запрос имеет два ?
затем сгенерируйте параметры так:
String param = "TEST123";
Object[] params = IntStream.range(0, 2)
.mapToObj(i -> param)
.toArray();
Это создаст массив, который содержит два раза TEST123
:
[TEST123, TEST123]
Затем просто отправьте массив объектов в ваш код, как вы делаете.
getJdbcTemplate().query(sql, params, CustomResultSetExtractor());
Если вы не знаете количество задержек или параметров в вашем запросе, вы можете считать их следующим образом:
int numberOfHold = sql.length() - sql.replaceAll("\\?", "").length();