SimpleJdbcTemplate 和空参数
Posted
技术标签:
【中文标题】SimpleJdbcTemplate 和空参数【英文标题】:SimpleJdbcTemplate and null parameters 【发布时间】:2010-11-12 13:43:07 【问题描述】:我使用 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
的空参数?
【问题讨论】:
【参考方案1】:他们说得有道理 - 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”,但我认为这不是一个选项。
【讨论】:
如果使用namedparameterjdbctemplate代替simplejdbctemplate,它会起作用吗?以上是关于SimpleJdbcTemplate 和空参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SimpleJdbcTemplate 上设置QueryTimeout?
Oracle SQL 查询在 JdbcTemplate 和 SimpleJdbcTemplate 中花费的时间太长
如何从 simplejdbctemplate 查询中获取字符串列表或类型 T?