SimpleJdbcTemplate и нулевые параметры - PullRequest
11 голосов
/ 21 июля 2009

Я использую 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 Ответ

6 голосов
/ 21 июля 2009

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

...