首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >java.sql.PreparedStatement.setArray():不支持交叉转换

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

Stack Overflow用户
提问于 2014-04-08 07:29:52
回答 1查看 3.8K关注 0票数 0

当我使用jdbc运行下面的查询时,会得到下面显示的异常。这是一个简化的示例,preparedStatementSetter的其他部分与setString和setInt等一起成功运行。

代码语言:javascript
运行
复制
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: jcc11717不支持从源类型对象进行交叉转换;ERRORCODE=-4461,SQLSTATE=42815为com.ibm.db2.jcc.am.id.a(id.java:677),com.ibm.db2.jcc.am.id.a(id.java:60),com.ibm.db2.jcc.am.id.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) at com.ibm.db2.jcc.am.go.a(go.java:2289) at com.ibm.db2.jcc.am.go.setArray(go.java:2254) at net.sf.log4jdbc.PreparedStatementSpy.setArray(PreparedStatementSpy.java:349) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native)在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122) . 93

EN

Stack Overflow用户

发布于 2014-04-08 07:39:10

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

代码语言:javascript
运行
复制
collection.toArray(new String[0]);

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

您还缺少了where关键字。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22930386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档