SimpleJdbcTemplate и нулевые параметры
-
18-09-2019 - |
Вопрос
Я использую 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», но я не думаю, что это вариант.