2016-08-31 2 views
4

Использование:"Порядковый связывания и Названный связывания" вопрос при вызове хранимой процедуры с JPA 2.1

  1. Spring бутсу 1.4.0.RELEASE
  2. JPA: 2,1
  3. Hibernate: 5.0.9
  4. Hibernate Диалект: org.hibernate.dialect.Oracle10gDialect
  5. Oracle Database: 12.1.0.2
  6. Oracle JDBC: ojdbc7 12.1.3-0-0

В сущности, когда я пытаюсь выполнить хранимую процедуру, я столкнулся с этой ошибкой:

operation not allowed: Ordinal binding and Named binding cannot be combined!

Полный трассировки стека выглядит следующим образом:

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", Integer.class, ParameterMode.OUT) 
    .setParameter("param1", request.getTransactiontypeId()); 
    sp.execute(); 

Включение SQL-debug outpu t, он показывает сгенерированный вызов sql как {call mySp(?,?)}.

Это кажется ... изворотливым (поскольку он не содержит намека на указанные имена), но я понимаю, что это может быть просто спящий режим, выполняющий внутренние переводы?

ЕСЛИ Я изменил сохраненную процедуру proc, чтобы вместо этого использовать позиционные параметры, все на самом деле работает, но я бы предпочел использовать именованные параметры.

ХП Спецификация:

PROCEDURE mySp (param1 IN tdocs.transactiontype_id%TYPE,
outParam OUT tdocs.doc_id%TYPE );

+0

Не могли бы вы добавить спецификацию процедуры PL/SQL 'mySp()' к вашему вопросу? –

+0

Сгенерированный sql нечетный. Oracle не поддерживает вопросительные знаки в качестве заполнителей переменных привязки. Похоже, что что-то происходит на уровне JDBC. – ibre5041

+0

@MartinSchapendonk SP spec добавлен, для чего это может стоить. – demaniak

ответ

0

Это кажется ошибка в Hibernate 5.0.9. Для меня переход на Hibernate 5.0.11.Final сделал трюк, без каких-либо изменений.

Спасибо Mihai Cicu за указание в этом направлении в комментариях.

+0

Начиная с похоже, что ответ «обновить» :) – demaniak

 Смежные вопросы

  • Нет связанных вопросов^_^