java.sql.PreparedStatement.setArray():不支持的交叉转换

时间:2014-04-08 07:29:52

标签: java sql jdbc db2 db2-luw

当我使用jdbc运行以下查询时,我收到如下所示的异常。 这是一个简化的例子,prepareStatementSetter的其他部分与setString和setInt等运行成功。

public List<EmployeeMonitoringResultTo> searchEmployeesForEmployerInRange(final GetEmployeesForEmployerInRangeCriteria criteria) {
    final StringBuilder sql = 
    new StringBuilder(  "select * from CODES c ")
                .append("    where c.TYPE in ( ? )  "); // TYPE has DATA_TYPE 12, TYPE_NAME VARCHAR

    return jdbcTemplate.query(
        sql.toString(),
        new PreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps) throws SQLException {
                ps.setArray(1, searchTypes());
            }
        },
        new SpecificRowMapper<SpecType>()
        );      
}

private Array searchTypes() {
    final Collection<String> collection = fetchStrings();

    Array resultArray = null;;
    try {
        resultArray = jdbcTemplate.getDataSource().getConnection().createArrayOf("VARCHAR", collection.toArray());
    } catch (SQLException e) {
        log.error("Problem with created java.sql.Array", e);
        throw e;
    }

    return resultArray;
}
  

引起:com.ibm.db2.jcc.am.SqlSyntaxErrorException:   [jcc] [10349] [11717] [4.13.80]来自源的不支持的交叉转换   类型对象; ERRORCODE = -4461,SQLSTATE = 42815 at   com.ibm.db2.jcc.am.id.a(id.java:677)at   com.ibm.db2.jcc.am.id.a(id.java:60)at   com.ibm.db2.jcc.am.id.a(id.java:103)at   com.ibm.db2.jcc.am.ic.a(ic.java:289)at   com.ibm.db2.jcc.am.ic.a(ic.java:191)at   com.ibm.db2.jcc.am.kc.a(kc.java:1943)at   com.ibm.db2.jcc.am.go.a(go.java:2289)at   com.ibm.db2.jcc.am.go.setArray(go.java:2254)at   com.jolbox.bonecp.PreparedStatementHandle.setArray(PreparedStatementHandle.java:261)     在   net.sf.log4jdbc.PreparedStatementSpy.setArray(PreparedStatementSpy.java:349)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     在java.lang.reflect.Method.invoke(Method.java:597)at   org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)     ... 93更多

1 个答案:

答案 0 :(得分:0)

toArray方法返回一个对象数组。您可以尝试使用字符串数组:

collection.toArray(new String[0]);

您可能无法使用带有IN运算符的SQL数组,因此您必须生成SQL而不是使用预准备语句。 (或者至少生成正确数量的问号,然后在循环中设置参数,如评论中建议的那样。)

您还缺少where关键字。