我编写了一个存储过程,它将返回整数值。但我无法得到jpa的计数。任何人都可以建议我调用存储过程的方法,并使用jpa将返回值转换为java中的某个变量。
int count = 0;
String id = "m123"
count = getEm().createNativeQuery("call sample_procedure(?,?)")
.setParameter(1, id)
.setParameter(2, count)
.executeUpdate();
存储过程:我在程序中有一些逻辑,内部循环我正在递增计数。
create or replace
PROCEDURE sample_procedure(
id IN VARCHAR,
count OUT NUMBER)
IS
........
BEGIN
.....
LOOP
---------
count := count + 1;
答案 0 :(得分:0)
我在程序和内部循环中有一些逻辑我正在递增计数。
首先,在给定用例的情况下,count
必须声明INOUT
(输入和输出)。
PROCEDURE sample_procedure(
id IN VARCHAR,
count INOUT NUMBER)
然后:
对于JPA< 2.1不支持从OUT
或INOUT
参数中获取值。所以,如果你需要继续使用该版本,你可能会陷入困境。
JPA> = 2.1明确支持使用EntityManager.html.createStoredProcedureQuery方法调用存储过程:
count = getEm().createStoredProcedureQuery("sample_procedure")
.registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
.registerStoredProcedureParameter(2, Integer.class, ParameterMode.INOUT)
.setParameter(1, id)
.setParameter(2, count);
storedProcedure.execute();
int count = (Integer)storedProcedure.getOutputParameterValue(2);
<子>未测试。小心拼写错误!
答案 1 :(得分:0)
与此answer
类似我尝试的选项:
在调用语句之前尝试使用花括号。
查询q = entitymanager.createNativeQuery(“{sample sample_procedure(?,?)}”)。setParameter(1,inparam).setParameter(2,outparam);
q.executeUpdate();
它不起作用。没有将输出返回给java类。
试过这个:
查询q = entitymanager.createNativeQuery(“{sample sample_procedure(?,?)}”,Integer.class).setParameter(1,inparam).setParameter(2,outparam);
q.executeUpdate();
它也没用。没有将输出返回给java类。
也试过这个:
查询q = entitymanager.createNativeQuery(“{sample sample_procedure(?,?)}”)。setParameter(1,inparam).setParameter(2,outparam);
q.getSingleResult();
这也引发了一个异常:无法对选择查询执行更新或删除操作:“{call sample_procedure(?,?)}”。
我认为不可能像上面提到的答案链接中的 Sean Patrick Floyd 所提到的那样。(注意:我没有这本书:))如果你需要处理你的out参数,如果这是你需要它的原因,你需要逻辑地处理它。似乎在jpa2.0中无法实现