повторно использовать параметр sql, когда не используются именованные параметры - PullRequest
0 голосов
/ 24 октября 2018

У меня есть запрос, который вызывается с помощью 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 ]

0 голосов
/ 24 октября 2018

Я бы предложил что-то еще, вы можете повторить свой параметр в массиве объектов, например, если ваш запрос имеет два ?, а затем сгенерировать параметры следующим образом:

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();
0 голосов
/ 24 октября 2018

Я поражен, что вы не нашли:

String sql = "select * from employee where id = ? and name = id";

Или вы имели в виду or вместо and?

String sql = "select * from employee where ? in (id, name)";
0 голосов
/ 24 октября 2018

Использование NamedParameterJdbcTemplate , обертка JdbcTemplate:

Шаблонный класс с базовым набором операций JDBC, позволяющий использовать именованные параметры вместо традиционных '?'placeholder.

Этот класс делегирует обернутую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...