以自定义类型对象作为参数的Spring-Boot / JPA错误调用过程

时间:2018-11-12 20:58:03

标签: java spring spring-boot jpa-2.1

我正在尝试使用JPA调用存储过程。当我从serviceImpl调用testWithNumber时,它可以正常工作,但是当我调用testWithType时,它会引发错误:

  

javax.persistence.PersistenceException:   org.hibernate.exception.SQLGrammarException:调用错误   CallableStatement.getMoreResults
  PLS-00306:调用“ TESTWITHTYPE”时参数的数量或类型错误

有一种方法可以调用具有自定义TYPE参数的存储过程?

同一包(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;
    }
}

0 个答案:

没有答案