存储过程
JPA 2.1规范通过使用JPA条件查询API引入了调用存储过程的支持。
我们引入了@Procedure用于在存储库方法上声明存储过程元数据的注释。
以下示例使用以下存储过程:
加1出局HSQL 数据库中的过程。/;
DROP procedure IF EXISTS plus1inout
/;
CREATE procedure plus1inout (IN arg int, OUT res int)
BEGIN ATOMIC
set res = arg + 1;
END
/;
存储过程的元数据可以通过使用NamedStoredProcedureQuery对实体类型的注释。
@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使用的名称。程序名称是存储过程在数据库中的名称。
你可以用多种方式引用仓库方法中的存储过程。
要调用的存储过程可以通过使用值或程序名称属性@Procedure注解。
它直接指向数据库中的存储过程,并忽略通过以下方式进行的任何配置@NamedStoredProcedureQuery.
或者你也可以指定@NamedStoredProcedureQuery.name属性为@Procedure.name属性。
如果都不是值,程序名称也不名称配置时,存储库方法的名称被用作名称属性。
以下示例展示了如何引用显式映射过程:
@Procedure("plus1inout")
Integer explicitlyNamedPlus1inout(Integer arg);
以下示例与前述等价,但使用程序名称别名:
程序名称别名。@Procedure(procedureName = "plus1inout")
Integer callPlus1InOut(Integer arg);
以下内容同样等价于前两者,但使用方法名称而非显式注释属性。
实体管理器通过使用方法名称。@Procedure
Integer plus1inout(@Param("arg") Integer arg);
以下示例展示了如何通过引用@NamedStoredProcedureQuery.name属性。
实体管理器.@Procedure(name = "User.plus1IO")
Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);
如果被调用的存储过程有单一输出参数,该参数可以作为方法的返回值返回。
如果在 中指定了多个出处参数@NamedStoredProcedureQuery注释 这些可以返回为地图密钥为参数名称@NamedStoredProcedureQuery注解。
注意,如果存储过程返回结果集则任意外参数被省略,因为 Java 只能返回单个方法返回值,除非该方法声明地图返回类型。 |
以下示例展示了如何获得多重外如果存储过程有多个参数外参数 和 被标记为@NamedStoredProcedureQuery.@NamedStoredProcedureQuery需要注册以提供参数元数据。
@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 {}
@Procedure(name = "User.multiple_out_parameters")
Map<String, Object> returnsMultipleOutParameters(@Param("arg") Integer arg);