Параметры SimpleJdbcTemplate и null

Я использую 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?

Ответ 1

У них есть точка - 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", но я не думаю, что это вариант.