Spring-Boot / JPA Ошибка вызова процедуры с объектами нестандартного типа в качестве параметров - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь вызвать хранимую процедуру с помощью JPA. Когда я вызываю testWithNumber из serviceImpl, он работает нормально, но когда я вызываю testWithType, он выдает ошибку:

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: ошибка вызова CallableStatement.getMoreResults
PLS-00306: неверный номер или типы аргументов при вызове 'TESTWITHTYPE'

Есть способ вызвать хранимую процедуру с параметрами пользовательского ТИПА?

Процедуры базы данных внутри одного пакета (PKG_TEST):

PROCEDURE testWithNumber (idName IN NUMBER, nameFound out VARCHAR2)
IS
BEGIN  
  SELECT NAME INTO nameFound FROM NAMES_TABLE WHERE ID_NAME=idName;
END test;

PROCEDURE testWithType (nameParam IN TEST_TYPE, nameFound out VARCHAR2)
IS
BEGIN  
  SELECT NAME INTO nameFound FROM NAMES_TABLE WHERE ID_NAME=nameParam.idName;
END test;

TEST_TYPE в базе данных выглядит так:

create or replace TYPE TEST_TYPE FORCE AS OBJECT 
(        
ID_NAME  NUMBER(22)
,
NAME  VARCHAR2(100)
);

Реализация сервиса:

@Override
public void testWithType(NameDto nameObject) {

    StoredProcedureQuery query = em.createStoredProcedureQuery("PKG_TEST.testWithType")
            .registerStoredProcedureParameter(1, NameDto.class, ParameterMode.IN)
            .setParameter(1, nameObject)
            .registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);

    query.execute();
    LOG.info(query.getOutputParameterValue(2));
}

@Override
public void testWithNumber(NameDto nameObject) {

    StoredProcedureQuery query = em.createStoredProcedureQuery("PKG_TEST.testWithNumber")
            .registerStoredProcedureParameter(1, Long.class, ParameterMode.IN)
            .setParameter(1, nameObject.getIdName())
            .registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);

    query.execute();

    LOG.info(query.getOutputParameterValue(2));
}  

Класс NameDto:

import java.io.Serializable;
import java.util.Date;

public class NameDto {

    Long ID_NAME;
    String NAME;

    public NameDto(Long iD_NAME, String nAME) {
        super();
        ID_NAME = iD_NAME;
        NAME = nAME;
    }

    public Long getID_NAME() {
        return ID_NAME;
    }

    public void setID_NAME(Long iD_NAME) {
        ID_NAME = iD_NAME;
    }

    public String getNAME() {
        return NAME;
    }

    public void setNAME(String nAME) {
        NAME = nAME;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...