从 EclipseLink PLSQLStoredProcedureCall 读取 OUT 参数时出现 ClassCastException

ClassCastException when reading OUT parameters from EclipseLink PLSQLStoredProcedureCall

我需要使用 EclipseLink (2.3.1.v20111018-r10243) 调用 Oracle 存储过程。程序有IN和OUT参数,我需要读取OUT参数。

我发现 this example 并且我的代码几乎是该示例的副本,但它没有从 API 接收列表,而是抛出异常,因为该值是一个整数值“1”,我不明白为什么。

程序调用正常,IN参数没问题,但是代码读取响应失败"should"根据示例是List。

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.eclipse.persistence.jpa.JpaEntityManager;
import org.eclipse.persistence.platform.database.jdbc.JDBCTypes;
import org.eclipse.persistence.platform.database.oracle.plsql.OraclePLSQLTypes;
import org.eclipse.persistence.platform.database.oracle.plsql.PLSQLStoredProcedureCall;
import org.eclipse.persistence.queries.DataModifyQuery;
import org.eclipse.persistence.sessions.DatabaseRecord;
import org.eclipse.persistence.sessions.Session;

public class ProcedureCall {

    @PersistenceContext
    private EntityManager em;

    public String execute(Long parameter) throws Exception {

        PLSQLStoredProcedureCall call = new PLSQLStoredProcedureCall();

        call.setProcedureName("two_arg_in_out");
        call.addNamedOutputArgument("X", OraclePLSQLTypes.BinaryInteger);
        call.addNamedArgument("Y", JDBCTypes.VARCHAR_TYPE, 40);

        DataModifyQuery query = new DataModifyQuery();
        query.setCall(call);
        query.addArgument("Y");

        List queryArgs = new ArrayList();
        queryArgs.add(parameter);

        Session session = ((JpaEntityManager) em.getDelegate()).getActiveSession();
        Object obj = session.executeQuery(query, queryArgs);

        // The system prints "Return: 1"
        System.out.println("Return: " + obj);

        List results = (List) obj; // Here is where exception happens

        DatabaseRecord record = (DatabaseRecord) results.get(0);
        String y = (String) record.get("X");

        return "done";
    }

}

系统抛出如下异常:

Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.List

这是我正在使用的示例中的过程:

PROCEDURE two_arg_in_out(x OUT BINARY_INTEGER, y IN VARCHAR) AS
BEGIN
 x := 33;
END;

这看起来类似于此处显示的示例:https://wiki.eclipse.org/EclipseLink/Examples/JPA/nonJDBCArgsToStoredProcedures#Handling_IN_and_OUT_arguments

不同之处在于您使用的是围绕 JDBC 的 executeUpdate 设计的 DataModifyQuery 来执行查询,因此 returns 是一个 int 而不是结果集。您将需要使用 DataReadQuery 来获取结果。