0

jdbc で次のクエリを実行すると、以下に示す例外が発生します。これは単純化された例であり、setString や setInt などを含む PreparedStatementSetter の他の部分は正常に実行されました。

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; からのサポートされていない相互変換。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) 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) at com.ibm.db2.jcc.am.kc.a(kc.java:1943) at 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. PreparedStatementSpy.setArray(PreparedStatementSpy.java:349) の sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブ メソッド) の sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.

4

1 に答える 1

0

toArray メソッドは、オブジェクトの配列を返します。文字列の配列を使用してみることができます:

collection.toArray(new String[0]);

とにかく、IN 演算子で SQL 配列を使用することはおそらくできないため、準備済みステートメントを使用する代わりに SQL を生成する必要があります。(または、コメントで提案されているように、少なくとも正しい数の疑問符を生成してから、ループでパラメーターを設定します。)

whereまた、キーワードが欠落しています。

于 2014-04-08T07:39:10.213 に答える