我正在以下列方式使用SimpleJdbcTemplate和MapSqlParameterSource:
MapSqlParameterSource parameterSource = new MapSqlParameterSource();
parameterSource.addValue("typeId", typeId, Types.BIGINT);
List<Long> ids = _jdbcTemplate.query(_selectIdByParameters, new EntityIdRowMapper(), parameterSource);
当typeId
(Long
)为null
时,查询会按以下方式查看:
SELECT id FROM XXX WHERE typeId = null
虽然我希望它能生成
SELECT id FROM XXX WHERE typeId IS NULL
我reported this issue,回复就是那个
您必须根据查询参数提供相应的SQL语句。
因此我的代码充斥着空检查。
是否有更优雅的方法来处理发送到SimpleJdbcTemplate
的空参数?
答案 0 :(得分:6)
他们有一个观点 - JdbcTemplate不是SQL解释器,只是替换了占位符。
我建议您使用实用程序方法构造您的子句,并将其连接到查询字符串:
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);
不太漂亮。或者,也许您可以将MySQL配置为允许“= NULL”,但我认为这不是一个选项。