2009-07-21 4 views
10

Я использую SimpleJdbcTemplate и MapSqlParameterSource в на следующие пути:SimpleJdbcTemplate и нулевые параметры

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 

Я reported this issue и ответ был, что

Вы должны предоставить соответствующее заявление SQL на основе ваших параметров запроса.

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

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

ответ

6

У них есть точка - JdbcTemplate не является интерпретатором SQL, он просто заменяет ваши заполнители.

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

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

+0

Будет ли это работать, если вместо simplejdbctemplate используется namedparameterjdbctemplate? –