Spring Data JPA:带有模式名称的存储过程

时间:2018-02-01 19:03:29

标签: oracle jpa stored-procedures spring-data

如果有人经历过从指定模式,包和过程名称的spring数据调用oracle存储过程的话。 我有以下实体:

@Entity
@Table(name = "ENTITY", schema = "SCHEMA_ENTITY")
@NamedStoredProcedureQueries({
@NamedStoredProcedureQuery(name = "name1",
    procedureName = "packageName.procName",
    parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "param1", type = String.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "return_value", type = BigDecimal.class)
    })})

public class EntityExp {

     @Id
    private Long keyId;
    ...
}

存储库:

 public interface EntityRepository extends JpaRepository<EntityExp, Long> {

   @Procedure(name = "name1")
   BigDecimal test(@Param("param1") String param1);
}

在服务实现中,自动装配后,我调用的过程如下:

BigDecimal returnVal = entityRepository.test(param1);

oracle存储过程定义是:

create or replace PACKAGE packageName as
          function procName(param1 IN VARCHAR)
               RETURN NUMBER;
END packageName;
create or replace PACKAGE BODY packageName
        IS
        function procName (param1 IN VARCHAR) 
        RETURN NUMBER
        IS
        BEGIN
        return 1;
        END;
        END;

如果我使用PL / Sql调用它,程序可以正常工作..

我收到以下错误:

PLS-00201: identifier 'package.procName' must be declared

我还测试了许多配置,比如在过程中指定模式:

@Procedure(name = "SCHEMA_ENTITY.name1")
BigDecimal test(@Param("param1") String param1);

但仍然失败......

在调用存储过程时,我无法找到使用schema + package + procedureName的任何示例...

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我不太确定完全了解您的问题,但我会尝试分享一些信息,因为我最近遇到了相关问题。

第一项与调用存储过程的方式有关。看起来Spring-data当前不支持返回的存储过程类型。有关详细信息link。但是,使用void它可以正常工作。

我通过创建一个单独的Repository解决了这个问题,我调用了通过entityManager返回结果的过程。举例说明link

第二项是关于模式名称。我相信当您解决第一项时,您可以使用this问题尝试解决它。简而言之,我在procedureName注释属性名称中设置了模式名称。

@NamedStoredProcedureQuery(
        name="procName",
        procedureName="<schema_name>.proc_name"
)
@Entity
@Table
public class User {
...
}

希望它有所帮助。