当前位置: 首页 > 知识库问答 >
问题:

Jdbc模板:动态可配置查询参数的问题

刘元青
2023-03-14

我有如下疑问:

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[]

所以我得到的<code>queryParams</code>字符串数组将是:

< code > String[] < code > query params ,其中< code>String[0]将是< code>2013-03-28,而< code>String[1]将是< code>helloWorld

当我将此String[]直接传递给模板queryForList方法时,如本文开头所述,将其强制转换为 object[]< ode=""> ,并且当我的log4j设置为 debugmode时,我会收到以下错误的终止:

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方法之前,如何将String正确格式化为预期类型?

我可以将属性文件更改为如下内容:

2013-06-28,DATE||helloWorld,VARCHAR

其中也传递关于值的类型的信息。但是使用这些信息,我如何将字符串转换成给定的类型——这样的方法是一个好的解决方案吗?

为什么log4j处于info模式时不会出现错误?

感谢阅读!

如果缺少任何详细信息,请告诉我。

共有1个答案

鲜于念
2023-03-14

< code>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在信息模式下不会出错,错误是随着调试模式而来的!jdbcDRiver不会在您将String()设置为日期类型时引发异常,但会返回诸如“代码:1292SQL状态:HY000---不正确的日期值”之类的警告,也许dbc模板使用调试模式来处理它。

 类似资料:
  • 我想检索Order对象的列表。每个Order对象可能都有一个OrderRows列表。OrderRows保存在单独的表中。如何将下面的查询与Jdbctemplate一起使用?

  • 我是Spring和J2EE的新手。我在使用带有Spring Boot自动配置的JDBC模板时遇到了问题。 我所做的是我以这里提供的RESTful Web服务为例,并决定将其扩展到使用JDBC模板关系数据库访问。不幸的是,提供的另一个示例不能有用,因为没有考虑从xml bean文件提供dataSource的唯一困难。 使用DAO Impl类作为Spring不同实现的扩展 我尝试了在Stack或Goo

  • 在下面的代码中,我有时会将设置为null。此时,它抛出错误为“could not extract resultset;SQL[n/a];嵌套异常为org.hibernate.exception.sqlgrammarexception:could not extract resultset” 即使为空,我如何获取数据。总有一天约会就要来了。这是怎么做的? null

  • 本文向大家介绍Dapper.NET 用动态参数查询,包括了Dapper.NET 用动态参数查询的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我有一个存储在列表中的关键字列表。 要从表中获取记录,请使用以下查询: 您可能已经注意到,我的查询容易受到sql注入的攻击,因此我想通过SqlCommand()使用参数。我已经尝试了以下方法,但仍然无法正常工作: 我在哪里犯错,或者应该怎么做? 问题答案: 您在这里做错了几件事: 您为所有参数赋予相同的名称。那行不通。参数需要唯一的名称。 您为每个项目创建一个新的SqlCommand。

  • 全局配置参数动态改变初始化配置,注意并不是所有的初始化配置都可以改变的 目前只可以改变以下参数 字段名称 备注 EnableDingTalk bool类型 动态控制是否开启DingTalk功能 如果false的话 添加job的窗体里面会没有配置DingTalk相关参数 CurrentDomain string类型 动态设置当前站点域名的功能,这个设置了会影响钉钉的发送内容里面增加一个当前通知job