SimpleJdbcTemplate e parâmetros nulos
-
18-09-2019 - |
Pergunta
Eu estou usando SimpleJdbcTemplate e MapSqlParameterSource no caminho folowing:
MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("typeId", typeId, Types.BIGINT);
List<Long> ids = _jdbcTemplate.query(_selectIdByParameters, new EntityIdRowMapper(), parameterSource);
Quando typeId
(que é um Long
) é null
, em seguida, os olhares de consulta da seguinte maneira:
SELECT id FROM XXX WHERE typeId = null
enquanto eu esperaria que para gerar
SELECT id FROM XXX WHERE typeId IS NULL
Eu informou esta questão ea resposta foi que
Você terá que fornecer a instrução SQL apropriada com base em seus parâmetros de consulta.
e, como consequência meu código está cheio de verificações nulos.
Existe uma maneira mais elegante de lidar com parâmetros nulos enviados para o SimpleJdbcTemplate
?
Solução
Eles têm um ponto -. JdbcTemplate não é um interpretador de SQL, ele só substitui os espaços reservados
Eu sugiro que você construir sua cláusula com um método de utilitário, e concat-lo para a string 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);
Não é muito bonita. Alternativamente, talvez você pode configurar o MySQL para permitir "= NULL", mas eu não acho que isso é uma opção.