【问题标题】:JdbcTemplate : Issue with dynamically configurable query argumentsJdbcTemplate:动态可配置查询参数的问题
【发布时间】: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-28String[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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2019-02-09
    • 2011-11-09
    • 1970-01-01
    • 2021-10-27
    • 2021-01-14
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多