2009-07-21 15 views
10

sto usando SimpleJdbcTemplate e MapSqlParameterSource nel modo folowing:SimpleJdbcTemplate e nulli i parametri

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

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

Quando typeId (che è un Long) è null, quindi la query appare nel seguente modo:

SELECT id FROM XXX WHERE typeId = null 

mentre mi sarei aspettato di generare

SELECT id FROM XXX WHERE typeId IS NULL 

Ho reported this issue e la risposta è stata che

Si dovrà fornire l'istruzione SQL appropriata, sulla base di parametri di query.

e di conseguenza il mio codice è pieno di assegni nulli.

C'è un modo più elegante di gestire parametri nulli inviati al SimpleJdbcTemplate?

risposta

6

hanno un punto - JdbcTemplate non è un interprete SQL, si sostituisce solo i vostri segnaposto.

vi consiglio di costruire la vostra clausola con un metodo di utilità, e concat alla stringa di query:

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

Non molto carina. In alternativa, forse è possibile configurare MySQL per consentire "= NULL", ma non penso che sia un'opzione.

+0

Funzionerà se si utilizza namedparameterjdbctemplate anziché simplejdbctemplate? –

Problemi correlati