JdbcTemplate:动态可配置查询参数的问题

时间:2013-09-05 05:59:22

标签: java spring jdbctemplate

我的查询如下:

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-28String[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 模式时,为什么不会出现错误?

感谢阅读!

如果遗漏任何细节,请告诉我。

1 个答案:

答案 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使用调试模式来处理它。