对于最新的稳定版本,请使用 Spring Data JPA 3.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Data JPA 3.3.1Spring中文文档

JPA 2.1 规范引入了对使用 JPA 条件查询 API 调用存储过程的支持。 我们引入了用于在存储库方法上声明存储过程元数据的注释。@ProcedureSpring中文文档

下面的示例使用以下存储过程:Spring中文文档

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

可以使用实体类型的批注来配置存储过程的元数据。NamedStoredProcedureQuerySpring中文文档

例 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 {}

请注意,存储过程有两个不同的名称。 是 JPA 使用的名称。 是存储过程在数据库中的名称。@NamedStoredProcedureQuerynameprocedureNameSpring中文文档

可以通过多种方式从存储库方法引用存储过程。 可以使用批注的 or 属性直接定义要调用的存储过程。 这直接引用数据库中的存储过程,并忽略任何配置。valueprocedureName@Procedure@NamedStoredProcedureQuerySpring中文文档

或者,您可以将属性指定为属性。 如果既没有配置,也没有配置,则使用存储库方法的名称作为属性。@NamedStoredProcedureQuery.name@Procedure.namevalueprocedureNamenamenameSpring中文文档

下面的示例演示如何引用显式映射的过程:Spring中文文档

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

以下示例与上一个示例等效,但使用别名:procedureNameSpring中文文档

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

以下内容再次等同于前两个,但使用方法名称而不是显式注释属性。Spring中文文档

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

下面的示例演示如何通过引用属性来引用存储过程。@NamedStoredProcedureQuery.nameSpring中文文档

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

如果被调用的存储过程具有单个 out 参数,则该参数可以作为方法的返回值返回。 如果在注释中指定了多个输出参数,则这些参数可以作为 a 返回,键是注释中给出的参数名称。@NamedStoredProcedureQueryMap@NamedStoredProcedureQuerySpring中文文档