Java DB2中参数数目可变的参数化sql in子句

Java DB2中参数数目可变的参数化sql in子句,java,spring,db2,Java,Spring,Db2,我的java程序中有一个sql,如下所示: String sql = "Select * from mySchema.myTable where product in (?) and myDate = ?"; 我的查询参数如下: Object[] params = {"\'abc\',\'pqr\',\'lmn\'",'2013-07-18'}; 我试图以以下方式执行: List<Map<String, Object>> results = jdbcTemplate.

我的java程序中有一个sql,如下所示:

String sql = "Select * from mySchema.myTable where product in (?) and myDate = ?";
我的查询参数如下:

Object[] params = {"\'abc\',\'pqr\',\'lmn\'",'2013-07-18'};
我试图以以下方式执行:

List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, params);
在堆栈跟踪的下一步:

Caused by: com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=3.59.81
at com.ibm.db2.jcc.am.dd.a(dd.java:668)
at com.ibm.db2.jcc.am.dd.a(dd.java:60)
at com.ibm.db2.jcc.am.dd.a(dd.java:127)
at com.ibm.db2.jcc.am.bn.c(bn.java:2546)
at com.ibm.db2.jcc.am.bn.a(bn.java:2053)
at com.ibm.db2.jcc.t4.cb.n(cb.java:802)
at com.ibm.db2.jcc.t4.cb.i(cb.java:259)
at com.ibm.db2.jcc.t4.cb.c(cb.java:54)
at com.ibm.db2.jcc.t4.q.c(q.java:44)
at com.ibm.db2.jcc.t4.rb.j(rb.java:147)
at com.ibm.db2.jcc.am.bn.ib(bn.java:2048)
at com.ibm.db2.jcc.am.cn.b(cn.java:3845)
at com.ibm.db2.jcc.am.cn.b(cn.java:3975)
at com.ibm.db2.jcc.am.cn.bc(cn.java:678)
at com.ibm.db2.jcc.am.cn.executeQuery(cn.java:652)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:643)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586)
如果字符串的类型为“abc”、“pqr”、“xyz”


谢谢你的阅读

我建议您使用更好的ORM,如MyBatis

另外,看起来您正在传递一个字符串参数作为日期。 您将字符串列表传递到语句中的
的解决方案也不起作用,您的

“'abc','cde'”
将在
in
语句中作为单个字符串处理,因为在参数化语句的参数中,所有SQL字符,如
都会被忽略(这是防止SQL注入的功能)。

简而言之,您不能。一个参数标记-一个值。@mustaccio:Yes。。字符串“'abc','pqr','xyz'”将是一个值。。这不是正确的吗?看看如果允许数组成为数组会发生什么<代码>对象[]参数={新字符串[]{“abc”,“pqr”,“lmn”},2013-07-18}
另请参见此答案:
Caused by: com.ibm.db2.jcc.am.SqlDataException: DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=3.59.81
at com.ibm.db2.jcc.am.dd.a(dd.java:668)
at com.ibm.db2.jcc.am.dd.a(dd.java:60)
at com.ibm.db2.jcc.am.dd.a(dd.java:127)
at com.ibm.db2.jcc.am.bn.c(bn.java:2546)
at com.ibm.db2.jcc.am.bn.a(bn.java:2053)
at com.ibm.db2.jcc.t4.cb.n(cb.java:802)
at com.ibm.db2.jcc.t4.cb.i(cb.java:259)
at com.ibm.db2.jcc.t4.cb.c(cb.java:54)
at com.ibm.db2.jcc.t4.q.c(q.java:44)
at com.ibm.db2.jcc.t4.rb.j(rb.java:147)
at com.ibm.db2.jcc.am.bn.ib(bn.java:2048)
at com.ibm.db2.jcc.am.cn.b(cn.java:3845)
at com.ibm.db2.jcc.am.cn.b(cn.java:3975)
at com.ibm.db2.jcc.am.cn.bc(cn.java:678)
at com.ibm.db2.jcc.am.cn.executeQuery(cn.java:652)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:643)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586)