Процедура вызова JPA createNativeQuery с нестандартным именем

#jpa

#jpa

Вопрос:

Я пытаюсь вызвать процедуру Oracle, используя Persistence API:

 @TransactionAttribute(TransactionAttributeType.REQUIRED)
public void removeProcess(User user, BigDecimal processId) {
    EntityManager em = emb.createEntityManager(user);
    em.createNativeQuery("{ call DOF.DF#DEL_PROCESS(?) }")
      .setParameter(1, processId)
      .executeUpdate();
    em.close();
}
  

И я получил следующее исключение:

 Caused by: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Invalid column index
Error Code: 17003
Call: { call DOF."DF?)" }
    bind => [1 parameter bound]
  

Если я скопирую DF#DEL_PROCESS в DF_DEL_PROCESS, все работает нормально. Как я могу избежать # в имени процедуры??

Ответ №1:

‘#’ — это внутренний маркер параметра по умолчанию, используемый в EclipseLink.

Вы можете изменить это, используя подсказку запроса «eclipselink.jdbc.parameter-delimiter»

Кроме того, если вы встроите параметр вместо использования setParameter(), он также должен работать.