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?

如何在 C# Rest API 中处理查询参数中的可选 ENUM - 无效和空值以及在 Swagger 中隐藏特定值

SpringJDBC

php语言判断零和空怎么判断啊?