【问题标题】:JdbcTemplate throws java.sql.SQLException:JdbcTemplate 抛出 java.sql.SQLException:
【发布时间】:2018-02-05 10:50:48
【问题描述】:
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: 无法在 java.util.ArrayList 之间进行转换 和 JAVA_OBJECT 同时使用 IN 子句查询数据库

已经尝试使用NamedParameterJdbcTemplate,它在列表中要求引号,这可能导致sql注入。使用 jdbcTemplate 来克服这个问题。

感谢任何帮助。

【问题讨论】:

  • 从 Object[] 参数中移除 []。 List 是一个对象,但它不是对象数组
  • 我怀疑是这种情况,queryForObject 函数需要一个对象数组作为参数。
  • 你自己说结果是'List'。
  • 'dates' 是一个列表,但 'params' 必须是一个 Object 数组。假设我再添加一个 where 子句作为制造商,那么我将不得不在“params”数组中传递 2 个值。即 Object[] 参数 = {日期,制造商}
  • 如果这是一个列表,并且你需要一个数组,你试过 dates.ToArray() 吗?

标签: java sql-server hibernate jdbctemplate


【解决方案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:关键字')'附近的语法不正确。根据我的研究,它需要在列表中使用单引号,这不是一个很好的方法。
  • @faisalpathan,你试过去掉:ids周围的括号吗?
  • 是的,当我删除括号时,它抛出了相同的错误,并带有不同的错误消息“'and'附近的语法不正确。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2020-05-11
相关资源
最近更新 更多