我的查询如下:
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的参数。所有参数都由双管分隔。
我正在使用管道分隔符上的split方法将此行读入String[]
。
所以我的queryParams
字符串数组将是:
String[]
queryParams
其中String[0]
为2013-03-28
而String[1]
为helloWorld
当我将此String[]
直接传递给模板queryForList
方法时,将其转换为Object[]
,如本文开头所述,当我的log4j设置为{{1模式,我收到以下错误的终止:
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)
但是,当我将log4j级别设置为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.]
时,此代码可以正常工作。
这次终止的原因是什么?
如何解决?
是否与参数类型有关(例如,当预期列为Date时,我将String传递给queryForList)?如果是这样,在传递给info
方法之前,如何正确地将String格式化为期望的类型?
我可以将属性文件更改为:
queryForList
还传递有关值类型的信息。但是使用这个信息,如何将String转换为给定类型 - 这种方法是一个很好的解决方案吗?
当log4j处于2013-06-28,DATE||helloWorld,VARCHAR
模式时,为什么不会出现错误?
感谢阅读!
如果遗漏任何细节,请告诉我。
答案 0 :(得分:0)
2013-06-28,DATE||helloWorld,VARCHAR
是个好方法
你可以让一些处理程序来解析它,比如:
Map<String,IConvert> converts = new HashMap<String, IConvert>(){
put("varchar",new StringConver());
put("date",new DateConver());
}
//then
converts.get(type).toParam(string)
我猜是为什么当log4j处于信息模式时错误未来,错误随debug mode
而来!当setString()为日期类型时,jdbcDriver不会抛出异常,但会返回警告,如“代码:1292 SQL状态:HY000 ---日期值不正确”
也许dbcTemplate使用调试模式来处理它。