2009-07-21 14 views
10

Używam SimpleJdbcTemplate i MapSqlParameterSource w folowing sposób:SimpleJdbcTemplate i zerowe parametry

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

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

Kiedy typeId (co jest Long) jest null, następnie kwerenda wygląda w następujący sposób:

SELECT id FROM XXX WHERE typeId = null 

natomiast Spodziewam się, że do wygenerowania

SELECT id FROM XXX WHERE typeId IS NULL 

mam reported this issue i odpowiedź była, że ​​

Trzeba będzie zapewnić odpowiednią instrukcję SQL w oparciu o indywidualne parametry zapytań.

iw konsekwencji mój kod jest zaśmiecony zerowymi czekami.

Czy istnieje bardziej elegancki sposób obsługi parametrów zerowych wysłanych do SimpleJdbcTemplate?

Odpowiedz

6

Mają punkt - JdbcTemplate nie jest interpreter SQL, po prostu zastępuje placeholder.

Proponuję skonstruować swoją klauzulę o sposobie użytkowego i Concat go do łańcucha zapytania:

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); 

Niezbyt ładna. Ewentualnie możesz skonfigurować MySQL, aby zezwolić na "= NULL", ale nie sądzę, że jest to opcja.

+0

Czy to działa, jeśli namedparameterjdbctemplate jest używany zamiast simplejdbctemplate? –