此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Data JPA 3.5.2spring-doc.cadn.net.cn

存储过程

JPA 2.1 规范引入了对使用 JPA 条件查询 API 调用存储过程的支持。我们引入了@Procedure用于在存储库方法上声明存储过程元数据的注释。spring-doc.cadn.net.cn

要遵循的示例使用以下存储过程:spring-doc.cadn.net.cn

示例 1.的定义plus1inoutHSQL DB 中的过程。
/;
DROP procedure IF EXISTS plus1inout
/;
CREATE procedure plus1inout (IN arg int, OUT res int)
BEGIN ATOMIC
 set res = arg + 1;
END
/;

存储过程的元数据可以通过使用NamedStoredProcedureQuery实体类型的注释。spring-doc.cadn.net.cn

示例 2.StoredProcedure 元数据定义。
@Entity
@NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout", parameters = {
  @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
  @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public class User {}

请注意@NamedStoredProcedureQuery存储过程有两个不同的名称。name是 JPA 使用的名称。procedureName是存储过程在数据库中的名称。spring-doc.cadn.net.cn

可以通过多种方式从存储库方法引用存储过程。 要调用的存储过程可以直接使用valueprocedureName属性的@Procedure注解。 这直接引用数据库中的存储过程,并通过@NamedStoredProcedureQuery.spring-doc.cadn.net.cn

或者,您可以指定@NamedStoredProcedureQuery.name属性作为@Procedure.name属性。 如果两者都不是value,procedureName也不name配置时,存储库方法的名称将用作name属性。spring-doc.cadn.net.cn

以下示例演示如何引用显式映射的过程:spring-doc.cadn.net.cn

示例 3.引用数据库中名称为“plus1inout”的显式映射过程。
@Procedure("plus1inout")
Integer explicitlyNamedPlus1inout(Integer arg);

以下示例等效于上一个示例,但使用procedureName别名:spring-doc.cadn.net.cn

示例 4.通过数据库中引用名称为“plus1inout”的隐式映射过程procedureName别名。
@Procedure(procedureName = "plus1inout")
Integer callPlus1InOut(Integer arg);

以下内容再次等效于前两个,但使用方法名称而不是显式注释属性。spring-doc.cadn.net.cn

示例 5.引用隐式映射的命名存储过程“User.plus1”EntityManager使用方法名称。
@Procedure
Integer plus1inout(@Param("arg") Integer arg);

以下示例演示如何通过引用@NamedStoredProcedureQuery.name属性。spring-doc.cadn.net.cn

示例 6.引用显式映射的命名存储过程“User.plus1IO”EntityManager.
@Procedure(name = "User.plus1IO")
Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);

如果被调用的存储过程具有单个输出参数,则该参数可能会作为方法的返回值返回。 如果在@NamedStoredProcedureQuery注释,这些可以作为Map键是@NamedStoredProcedureQuery注解。spring-doc.cadn.net.cn

请注意,如果存储过程返回ResultSet然后任何OUT参数被省略,因为 Java 只能返回单个方法返回值,除非该方法声明Map返回类型。

以下示例显示如何获取多个OUT参数,如果存储过程有多个OUT参数,并注册为@NamedStoredProcedureQuery.@NamedStoredProcedureQuery需要注册才能提供参数元数据。spring-doc.cadn.net.cn

示例 7.StoredProcedure 元数据定义。
@Entity
@NamedStoredProcedureQuery(name = "User.multiple_out_parameters", procedureName = "multiple_out_parameters", parameters = {
  @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
  @StoredProcedureParameter(mode = ParameterMode.REF_CURSOR, name = "some_cursor", type = void.class),
  @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) })
public class User {}
示例 8.返回多个 OUT 参数
@Procedure(name = "User.multiple_out_parameters")
Map<String, Object> returnsMultipleOutParameters(@Param("arg") Integer arg);