JPA在包含多个输出参数的数据库中调用存储过程

时间:2012-04-20 11:32:03

标签: hibernate postgresql stored-procedures jpa

我在数据库中有一个包含多个OUT参数的存储过程。我想使用JPA(使用Hibernate)来获取结果集。有没有办法从OUT参数中获取所有结果?

E.g。使用CallableStatement时,可以对这些参数使用“.registerOutParameter”。我想要JPA的等价物(如果存在/可能)。

使用的数据库是PostgreSQL。

3 个答案:

答案 0 :(得分:1)

JPA2.1将根据您的需要提供StoredProcedure支持(尚未最终)。提供此AFAIK预览功能的唯一JPA实现是DataNucleus JPA。其他JPA impls可能有自己的非标准支持,因此如果想要走那条路线,请查看您的手册

答案 1 :(得分:0)

在这里,您可以通过实现自定义存储库轻松地从spring数据JPA存储库调用存储过程。

  1. 创建一个界面并定义您的方法。
  2. 使用@Repository创建impl for itnotate
  3. 在下面的方法实现中是ti实现的方式

     StoredProcedureQuery storedProcedure = entityManager.createStoredProcedureQuery("Your Stored Procedure name");
    
    // Set the parameters of the stored procedure.
    String firstParam = "first param name";
    storedProcedure.registerStoredProcedureParameter(firstParam, Long.class, ParameterMode.IN);
    storedProcedure.setParameter(firstParam, first Param value);
    
    // Set the second parameters of the stored procedure.
    String secondParam = "second parameter name";
    storedProcedure.registerStoredProcedureParameter(secondParam, String.class, ParameterMode.IN);
    storedProcedure.setParameter(secondParam, "second paramter value);
    
    //Your OUT parameters.
    storedProcedure.registerStoredProcedureParameter("First OUT parameter name", Integer.class, ParameterMode.OUT);
    storedProcedure.registerStoredProcedureParameter("OUT second parameter name", Integer.class, ParameterMode.OUT);
    storedProcedure.execute();
    //Replace MyObject with your actual POJO
    MyObject myObject= new MyObject();
    myObject.setFirstParameterOutput((Integer) storedProcedure.getOutputParameterValue("first OUT parameter name"));
    myObject.setSecondParameterOutput((Integer) storedProcedure.getOutputParameterValue("second OUT parameter name"));
    return MyObject;
    
  4. 注意:即使您可以通过注释@Procedure

    从Repository本身调用
    @Procedure
    public Integer procedure_name(String firstParameter, Date secondParameter);
    
     }
    

答案 2 :(得分:0)

此说明基于Spring Boot + Spring Data JPA + Hibernate。

  1. @NamedStoredProcedureQuery实体类中为存储过程定义一个Example,如下所示。在此示例中,假定存储过程分别具有ININOUTOUT类型的参数。

    @NamedStoredProcedureQueries({
        @NamedStoredProcedureQuery(
            name = "Example.myStoredProcedure",
            procedureName = "db.MY_STORED_PRODEDURE",
            parameters = {
                @StoredProcedureParameter(mode = ParameterMode.IN, name = "pInParam", type = String.class),
                @StoredProcedureParameter(mode = ParameterMode.OUT, name = "pOutParam", type = Date.class),
                @StoredProcedureParameter(mode = ParameterMode.INOUT, name = "pInOutParam", type = Integer.class),
            }
        )
    })
    @Entity
    public class Example {
        @Id
        Integer id;
    
        ...
    }
    
  2. 仅使用存储过程的ExampleRepositoryIN参数定义INOUT类中的方法。正确设置procedureName的参数value@Procedure的值。此方法的返回类型应始终为Map<String, ?>

    @Repository
    public interface ExampleRepository extends JpaRepository<Example, Integer> {
           @Procedure(value = "Example.myStoredProcedure", procedureName = "db.MY_STORED_PRODEDURE")
            Map<String, ?> executeMyStoredProcedure(@Param("pInParam") String pInParam, @Param("pInOutParam") String pInOutParam);
    
    }
    
  3. ExampleService类中调用上述定义的方法,如下所示。现在,您可以使用在步骤1中定义的OUT名称,从方法返回的INOUT中检索多个Map<String, ?>值(@StoredProcedureParameter)。

    @Service
    public Class ExampleService {
       final ExampleRepository exampleRepository;
    
       public ExampleService(ExampleRepository exampleRepository) {
           this.exampleRepository = exampleRepository;
       }
    
       public void executeMyStoredProcedure(String someString, Integer someInteger) {
           Map<String, ?> result = exampleRepository.executeMyStoredProcedure(someString, someInteger);
    
           Date dateValue = (Date) result.get("pOutParam");
           Integer integerValue = (Integer) result.get("pInOutParam");
    
           ...
    
       }
    }