Java 从具有多个引用游标的Hibernate调用存储过程
我正在尝试从存储过程中检索值。此存储过程有两个ref游标。以下是SP:Java 从具有多个引用游标的Hibernate调用存储过程,java,spring,hibernate,jpa,stored-procedures,Java,Spring,Hibernate,Jpa,Stored Procedures,我正在尝试从存储过程中检索值。此存储过程有两个ref游标。以下是SP: create or replace PROCEDURE "EMP_JOB" ( p_job VARCHAR2, p_emp_refcur IN OUT SYS_REFCURSOR, p_sal_refcur IN OUT SYS_REFCURSOR ) IS BEGIN OPEN p_emp_refcur FOR SELECT empno, ename
create or replace PROCEDURE "EMP_JOB" (
p_job VARCHAR2,
p_emp_refcur IN OUT SYS_REFCURSOR,
p_sal_refcur IN OUT SYS_REFCURSOR
)
IS
BEGIN
OPEN p_emp_refcur FOR
SELECT empno, ename
FROM emp
WHERE job = p_job;
OPEN p_sal_refcur FOR
SELECT sal
FROM emp
WHERE job = p_job;
END;
以下是我的java代码:
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("EMP_JOB")
.registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
.registerStoredProcedureParameter(2, Class.class, ParameterMode.REF_CURSOR)
.registerStoredProcedureParameter(3, Class.class, ParameterMode.REF_CURSOR)
.setParameter(1, "CLERK");
query.execute();
Iterator queryIterator = query.getResultList().iterator();
ArrayList<Object> vinArray= new ArrayList<Object>();
while(queryIterator.hasNext()){
Object st= (Object)queryIterator.next();
vinArray.add(st);
}
StoredProcedureQuery=entityManager.CreateStoreProcedureQuery(“EMP_作业”)
.registerStoredProcedureParameter(1,String.class,ParameterMode.IN)
.registerStoredProcedureParameter(2,Class.Class,ParameterMode.REF\u游标)
.registerStoredProcedureParameter(3,Class.Class,ParameterMode.REF\u游标)
.setParameter(1,“职员”);
query.execute();
迭代器queryIterator=query.getResultList().Iterator();
ArrayList vinArray=新的ArrayList();
while(queryIterator.hasNext()){
Object st=(Object)queryIterator.next();
添加(st);
}
我可以检索参数2的输出(p\u emp\u refcur IN OUT SYS\u REFCURSOR
)
如何获取参数3的输出(p\u sal\u refcur IN OUT SYS\u REFCURSOR
)
任何帮助都将不胜感激
提前感谢已向Hibernate团队提出的问题:
看来这还是不可能的。但是,这里有一个解决方法,从Hibernate
EntityManager
获取连接,然后使用CallableStatement
//Session=org.hibernate.Session
//entityManager=javax.persistence.entityManager
Session Session=entityManager.unwrap(Session.class);
会议.工作(新工作){
@凌驾
public void execute(连接con)引发SQLException{
//做些有用的事
try(CallableStatement cs=con.prepareCall(“{CALL TEST_PACKAGE.GETCURSORS(?,?)}”)){
cs.setInt(1,1);
registerOutParameter(2,OracleTypes.CURSOR);
registerOutParameter(3,OracleTypes.CURSOR);
cs.execute();
ResultSet rs=(ResultSet)cs.getObject(2);
ResultSet rs1=(ResultSet)cs.getObject(3);
while(rs.next()){
int a=rs.getInt(1);
系统输出打印项次(a);
}
while(rs1.next()){
intb=rs1.getInt(1);
系统输出打印ln(b);
}
}
}
});
现在是2020年,这个问题仍然没有解决。最好不要使用Hibernate的JPA支持。