加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用Jpa 2.1调用存储过程时出现“序列绑定和命名绑定”

发布时间:2020-12-15 02:16:28 所属栏目:Java 来源:网络整理
导读:使用: Spring Boot 1.4.0.RELEASE JPA:2.1 休眠:5.0.9 Hibernate方言:org.hibernate.dialect.Oracle10gDialect Oracle数据库:12.1.0.2 Oracle JDBC:ojdbc7 12.1.3-0-0 实质上,当我尝试执行存储过程时,我遇到了这个错误: 操作不允许:序号绑定和命名绑
使用:

> Spring Boot 1.4.0.RELEASE
> JPA:2.1
>休眠:5.0.9
> Hibernate方言:org.hibernate.dialect.Oracle10gDialect
> Oracle数据库:12.1.0.2
> Oracle JDBC:ojdbc7 12.1.3-0-0

实质上,当我尝试执行存储过程时,我遇到了这个错误:

操作不允许:序号绑定和命名绑定不能合并!

完整堆栈跟踪如下:

2016-08-31 13:35:37.906+0200 | APP | WARN  | MvcAsync1 | o.h.e.j.s.SqlExceptionHelper | SQL Error: 17090,SQLState: 99999
2016-08-31 13:35:37.907+0200 | APP | ERROR | MvcAsync1 | o.h.e.j.s.SqlExceptionHelper | operation not allowed: Ordinal binding and Named binding cannot be combined!
2016-08-31 13:35:37.909+0200 | APP | ERROR | http-nio-8081-exec-3 | o.a.c.c.C.[.[.[.[dispatcherServlet] | Servlet.service() for servlet dispatcherServlet threw exception
java.sql.SQLException: operation not allowed: Ordinal binding and Named binding cannot be combined!
    at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:5626)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1385)
    at org.hibernate.result.internal.OutputsImpl.<init>(OutputsImpl.java:52)
    at org.hibernate.procedure.internal.ProcedureOutputsImpl.<init>(ProcedureOutputsImpl.java:32)
    at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:411)
    at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:363)
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.outputs(StoredProcedureQueryImpl.java:234)
    at org.hibernate.jpa.internal.StoredProcedureQueryImpl.execute(StoredProcedureQueryImpl.java:217)
    at com.mycomp.services.DocumenServiceImpl.addNewDoc(DocumentServiceImpl.java:88)
    at com.mycomp.backend.rest.CreateController.lambda$0(CreateController.java:39)
    at org.springframework.web.context.request.async.WebAsyncManager$4.run(WebAsyncManager.java:316)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.lang.Thread.run(Thread.java:745)

调用代码如下:

StoredProcedureQuery sp = em.createStoredProcedureQuery("mySp")
    .registerStoredProcedureParameter("param1",Integer.class,ParameterMode.IN)                
    .registerStoredProcedureParameter("outParam",ParameterMode.OUT)
    .setParameter("param1",request.getTransactiontypeId());
    sp.execute();

打开SQL调试输出,它将生成的sql调用显示为
{call mySp(?,?)}.

这似乎……狡猾(因为它不包含任何指定名称的暗示),但我知道它可能只是在做内部翻译的hibernate?

如果我改变存储过程设置以使用位置参数,事情实际上工作,但我真的更喜欢使用命名参数.

存储过程规范:

程序mySp(param1 IN tdocs.transactiontype_id%TYPE,
?????????outParam OUT tdocs.doc_id%TYPE
??);

解决方法

这似乎是Hibernate 5.0.9中的一个错误.对我来说,切换到Hibernate 5.0.11.Final做了伎俩,没有其他变化.

感谢Mihai Cicu在评论中指出了这个方向.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读