【发布时间】:2013-09-05 05:59:22
【问题描述】:
我有一个查询如下:
SELECT COL1, COL2 FROM SCHEM1.TAB1 WHERE COL3=? AND COL4=?
我在我的 java 类中执行上述查询:
List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sql, (Object[]) queryParams);
问题是我在运行时从文本属性文件中获取queryParams,如下所示:
2013-03-28||helloWorld
如上一行所示,属性文件具有 sql 参数。所有参数都由双竖线分隔。
我正在使用管道分隔符上的拆分方法将此行读入String[]。
所以我得到的 queryParams 字符串数组将是:
String[] queryParams 其中String[0] 将是2013-03-28 和String[1] 将是helloWorld
当我将这个String[] 直接传递给模板queryForList 方法时,如本文开头所述,将其转换为Object[],并且当我的log4j 设置为debug 模式时,我将被终止关于以下错误:
Exception in thread "main" java.lang.Error: SQLWarning chain holds value that is not a SQLWarning
at java.sql.SQLWarning.getNextWarning(SQLWarning.java:91)
at org.springframework.jdbc.core.JdbcTemplate.handleWarnings(JdbcTemplate.java:1260)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:796)
at com.hsbc.pb.it.re.db.dao.impl.ReconDaoImplNew.getColumnList(MyClass.java:362)
控制台中此错误上方的一行提到:
SQLWarning ignored: SQL state 'null', error code '0', message [Input data type mismatch, see chained exceptions; will retry execution using describe input information. Please change application to use an input data type that matches the database column type as required by JDBC semantics.]
但是,当我将 log4j 级别设置为 info 时,此代码可以正常工作。
这次终止的原因是什么?
如何解决?
是否与参数类型有关(例如,当预期的列是 Date 时,我将 String 传递给 queryForList)?如果是这样,在传递给queryForList 方法之前,如何正确地将字符串格式化为预期类型?
我可以将属性文件更改为:
2013-06-28,DATE||helloWorld,VARCHAR
还传递有关值类型的信息。但是使用这些信息,我怎样才能将字符串转换为给定的类型——这种方法是一个很好的解决方案吗?
为什么 log4j 处于info 模式时没有出现错误?
感谢阅读!
如果缺少任何细节,请告诉我。
【问题讨论】:
-
Input data type mismatch:那么您是否将 '2013-06-28' 转换为 queryParams 中的日期对象?
标签: java spring jdbctemplate