Вопрос

Я использую SimpleJdbcTemplate и MapSqlParameterSource следующим образом:

MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("typeId", typeId, Types.BIGINT);

List<Long> ids = _jdbcTemplate.query(_selectIdByParameters, new EntityIdRowMapper(), parameterSource);

Когда typeId (что представляет собой Long ) является null, то запрос выглядит следующим образом:

SELECT id FROM XXX WHERE typeId = null

тогда как я ожидаю, что он сгенерирует

SELECT id FROM XXX WHERE typeId IS NULL

у меня есть сообщил об этой проблеме и ответ был такой

Вам необходимо будет предоставить соответствующий оператор SQL на основе параметров вашего запроса.

и, как следствие, мой код завален нулевыми проверками.

Есть ли более элегантный способ обработки нулевых параметров, отправляемых в SimpleJdbcTemplate?

Это было полезно?

Решение

Они правы: JdbcTemplate не является интерпретатором SQL, он просто заменяет ваши заполнители.

Я предлагаю вам создать свое предложение с помощью служебного метода и соединить его со строкой запроса:

String createNullCheckedClause(String column, Object value) {
   String operator = (value == null ? "is" : "=");
   return String.format("(%s %s ?)", column, operator);
}

...

String query = "select * from table where " + createNullCheckedClause("col", x);

Не очень красиво.В качестве альтернативы, возможно, вы можете настроить MySQL на разрешение «= NULL», но я не думаю, что это вариант.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top