我在数据库中有一个包含多个OUT参数的存储过程。我想使用JPA(使用Hibernate)来获取结果集。有没有办法从OUT参数中获取所有结果?
E.g。使用CallableStatement时,可以对这些参数使用“.registerOutParameter”。我想要JPA的等价物(如果存在/可能)。
使用的数据库是PostgreSQL。
答案 0 :(得分:1)
JPA2.1将根据您的需要提供StoredProcedure支持(尚未最终)。提供此AFAIK预览功能的唯一JPA实现是DataNucleus JPA。其他JPA impls可能有自己的非标准支持,因此如果想要走那条路线,请查看您的手册
答案 1 :(得分:0)
在这里,您可以通过实现自定义存储库轻松地从spring数据JPA存储库调用存储过程。
在下面的方法实现中是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;
注意:即使您可以通过注释@Procedure
从Repository本身调用@Procedure
public Integer procedure_name(String firstParameter, Date secondParameter);
}
答案 2 :(得分:0)
此说明基于Spring Boot + Spring Data JPA + Hibernate。
在@NamedStoredProcedureQuery
实体类中为存储过程定义一个Example
,如下所示。在此示例中,假定存储过程分别具有IN
,INOUT
和OUT
类型的参数。
@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;
...
}
仅使用存储过程的ExampleRepository
和IN
参数定义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);
}
在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");
...
}
}