2009-07-21 24 views
10

estoy usando SimpleJdbcTemplate y MapSqlParameterSource en la forma folowing:SimpleJdbcTemplate y nulos parámetros

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

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

Cuando typeId (que es un Long) es null, la consulta se ve de la siguiente manera:

SELECT id FROM XXX WHERE typeId = null 

mientras que yo esperaría que genere

SELECT id FROM XXX WHERE typeId IS NULL 

he reported this issue y la respuesta fue que

Usted tendrá que proporcionar la instrucción SQL adecuado en función de sus parámetros de consulta.

y como consecuencia mi código está lleno de verificaciones nulas.

¿Existe alguna forma más elegante de manejar los parámetros nulos enviados al SimpleJdbcTemplate?

Respuesta

6

Tienen un punto: JdbcTemplate no es un intérprete de SQL, solo reemplaza tus marcadores de posición.

que sugieren que la construcción de su cláusula con un método de utilidad, y ConCat a la cadena de consulta:

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

muy bonita. Alternativamente, quizás puedas configurar MySQL para permitir "= NULL", pero no creo que sea una opción.

+0

¿Funcionará, si se utiliza parameterjdbctemplate named en vez de simplejdbctemplate? –