存储过程

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

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

例子1。该定义加1出局HSQL 数据库中的过程。
/;
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存储过程有两个不同的名称。名称这是JPA使用的名称。程序名称是存储过程在数据库中的名称。spring-doc.cadn.net.cn

你可以用多种方式引用仓库方法中的存储过程。 要调用的存储过程可以通过使用程序名称属性@Procedure注解。 它直接指向数据库中的存储过程,并忽略通过以下方式进行的任何配置@NamedStoredProcedureQuery.spring-doc.cadn.net.cn

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

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

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

以下示例与前述等价,但使用程序名称别名:spring-doc.cadn.net.cn

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

以下内容同样等价于前两者,但使用方法名称而非显式注释属性。spring-doc.cadn.net.cn

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

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

例子6。引用明确映射的命名存储过程“User.plus1IO”实体管理器.
@Procedure(name = "User.plus1IO")
Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);

如果被调用的存储过程有单一输出参数,该参数可以作为方法的返回值返回。 如果在 中指定了多个出处参数@NamedStoredProcedureQuery注释 这些可以返回为地图密钥为参数名称@NamedStoredProcedureQuery注解。spring-doc.cadn.net.cn

注意,如果存储过程返回结果集则任意参数被省略,因为 Java 只能返回单个方法返回值,除非该方法声明地图返回类型。

以下示例展示了如何获得多重如果存储过程有多个参数参数 和 被标记为@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);