0

当我使用 jdbc 运行以下查询时,出现如下所示的异常。这是一个简化的例子,preparedStatementSetter 和 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] 源类型 Object 的不支持交叉转换;。在 com.ibm.db2.jcc.am.id.a(id.java:677) 在 com.ibm.db2.jcc.am.id.a(id.java:60) 的 ERRORCODE=-4461, SQLSTATE=42815在 com.ibm.db2.jcc.am.id.a(id.java:103) 在 com.ibm.db2.jcc.am.ic.a(ic.java:289) 在 com.ibm.db2.jcc .am.ic.a(ic.java:191) 在 com.ibm.db2.jcc.am.kc.a(kc.java:1943) 在 com.ibm.db2.jcc.am.go.a(go .java:2289) 在 com.ibm.db2.jcc.am.go.setArray(go.java:2254) 在 com.jolbox.bonecp.PreparedStatementHandle.setArray(PreparedStatementHandle.java:261) 在 net.sf.log4jdbc。在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.

4

1 回答 1

0

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

collection.toArray(new String[0]);

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

您还缺少where关键字。

于 2014-04-08T07:39:10.213 回答