JdbcTemplate抛出java.sql.SQLException异常:

3
String query = "Select count(*) from product where date_added in (?)";

Object[] params = {dates}; //dates is a list of java.sql.Date

Long productCount = jdbcTemplate.queryForObject(query, params, Long.class);

最后一行抛出异常:

java.sql.SQLException: 在使用 IN 语句查询数据库时,无法在 java.util.ArrayList 和 JAVA_OBJECT 之间进行转换

已尝试使用 NamedParameterJdbcTemplate,但需要在列表中添加引号,这可能导致 SQL 注入。因此使用 jdbcTemplate 来解决该问题。

希望能得到任何帮助。


从Object[] params中删除[]。List是一个对象,但它不是一个对象数组。 - Stultuske
你自己说过,结果是一个“列表”。 - Stultuske
这在Java中是语法上不正确的。你可以遍历列表,或者使用“toArray”或类似的方法,但不能直接将List赋值给对象数组。 - Stultuske
@WepOn,params对象必须是一个数组,而不是日期列表。日期集合必须是List接口的实现。 - faisal pathan
@StuItuske 当在查询参数中传递集合时,在这种特定情况下,jdbc 期望 List 的实现。 - faisal pathan
显示剩余3条评论
1个回答

1
您需要一个参数源:

Set<Integer> ids = ...;

MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids", ids);

List<Foo> foo = getJdbcTemplate().query("SELECT * FROM foo WHERE a IN (:ids)", 
parameters, getRowMapper());

只有当getJdbcTemplate()返回类型为NamedParameterJdbcTemplate的实例时,此方法才有效。还要确保将结果捕获到列表中。

我在问题中提到了我尝试了这个修复方法。但它再次抛出java.sql.SQLException: 关键字')'附近的语法不正确。根据我的研究,它期望列表中有单引号,这不是一个很好的方法。 - faisal pathan
@faisalpathan,您是否尝试过去掉:ids周围的方括号? - M. Prokhorov
是的,当我去掉括号后,它抛出了相同的错误,但错误消息不同:“'and' 附近语法不正确”。 - faisal pathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接