从 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 来获取结果。
我需要使用 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 来获取结果。