2009-07-21 7 views
10

J'utilise SimpleJdbcTemplate et MapSqlParameterSource de la manière que vous avez choisi:paramètres SimpleJdbcTemplate et null

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

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

Lorsque typeId (qui est un Long) est null, la requête regarde de la façon suivante:

SELECT id FROM XXX WHERE typeId = null 

alors que je pense qu'elle doit générer

SELECT id FROM XXX WHERE typeId IS NULL 

J'ai reported this issue et la réponse était que

Vous devrez fournir l'instruction SQL appropriée en fonction de vos paramètres de requête.

et par conséquent mon code est jonché de vérifications nuls.

Existe-t-il une manière plus élégante de gérer les paramètres null envoyés au SimpleJdbcTemplate?

Répondre

6

Ils ont un point - JdbcTemplate n'est pas un interpréteur SQL, il remplace simplement vos espaces réservés.

Je vous suggère de construire votre article avec une méthode utilitaire et concat à la chaîne de requête:

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

Pas très jolie. Alternativement, peut-être vous pouvez configurer MySQL pour autoriser "= NULL", mais je ne pense pas que ce soit une option.

+0

Cela fonctionnera-t-il si namedparameterjdbctemplate est utilisé à la place de simplejdbctemplate? –

Questions connexes