我们通过 @Procedure 来介绍一下,JPA 对储存过程的支持。

(1)@Procedure 源码如下:

public @interface Procedure {// 数据库里面储存过程的名称String value() default "";// 数据库里面储存过程的名称String procedureName() default "";//在EntityManager中的名字,NamedStoredProcedureQuery使用String name() default "";//输出参数的名字String outputParameterName() default "";
}

(2)首先创建一个储存过程名字叫 plus1inout 有两个参数、两个结果。

CREATE PROCEDURE plus1inout(IN arg int, OUT res int)
BEGINSELECT (arg+10) into res;
END

(3)我们可以使用 @NamedStoredProcedureQueries 注释来调用存储过程,这个必须定义在一个实体上面。

@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 {//这个是一个Procedure实体类,可以通过NamedStoredProcedureQueries在这个类里面定义多个储存过程的查询。
}

关键要点:

  • 存储过程使用了注释 @NamedStoredProcedureQuery,并绑定到一个 JPA 表;
  • procedureName 是存储过程的名字;
  • name 是 JPA 中的存储过程的名字;
  • 使用注释 @StoredProcedureParameter 来定义存储过程使用的 IN/OUT 参数。

(4)直接通过自定义过的 Repository 完成储存过程的调用。

public interface MyUserRepository extends CrudRepository<User, Long> {
@Procedure("plus1inout")//通过储存过程的名字
Integer explicitlyNamedPlus1inout(Integer arg);
@Procedure(procedureName = "plus1inout")//通过储存过程的名字
Integer plus1inout(Integer arg);
@Procedure(name = "User.plus1IO")//自定义的储存过程的名字
Integer entityAnnotatedCustomNamedProcedurePlus1IO(@Param("arg") Integer arg);
}

关键要点:

  • @Procedure 的 procedureName 参数必须匹配 @NamedStoredProcedureQuery 的 procedureName。
  • @Procedure 的 name 参数必须匹配 @NamedStoredProcedureQuery 的 name。
  • @Param 必须匹配 @StoredProcedureParameter 注释的 name 参数。
  • 返回类型必须匹配:in_only_test存储过程返回是 void,in_and_out_test存储过程必须返回 String。

Spring Data JPA 从入门到精通~@Procedure 储存过程的查询方法相关推荐

  1. Spring Data JPA 从入门到精通~@Version处理乐观锁的问题

    @Version 处理乐观锁的问题 @Version 乐观锁介绍 我们在研究 Auditing 的时候,发现了一个有趣的注解 @Version,源码如下: package org.springfram ...

  2. spring data jpa从入门到精通_Spring Data JPA的简单入门

    前言 spring data JPA是spring团队打造的sping生态全家桶的一部分,本身内核使用的是hibernate核心源码,用来作为了解java持久层框架基本构成的样本是再好不过的选择.最近 ...

  3. Spring Data JPA 从入门到精通~Naming命名策略详解及其实践

    Naming 命名策略详解及其实践 用 JPA 离不开 @Entity 实体,我都知道实体里面有字段映射,而字段映射的方法有两种: 显式命名:在映射配置时,设置的数据库表名.列名等,就是进行显式命名, ...

  4. Spring Data JPA 从入门到精通~默认数据源的讲解

    默认数据源 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://1 ...

  5. Spring Data JPA 从入门到精通~Auditing及其事件详解

    Auditing 及其事件详解 Auditing 翻译过来是审计和审核,Spring 的优秀之处在于帮我们想到了很多繁琐事情的解决方案,我们在实际的业务系统中,针对一张表的操作大部分是需要记录谁什么时 ...

  6. Spring Data JPA 从入门到精通~实际工作的应用场景

    在实际工作中,有哪些场景会用到自定义 Repository 呢,这里列出几种实际在工作中的应用案例. 1. 逻辑删除场景 可以用到上面说的两种实现方式,如果有框架级别的全局自定义 Respositor ...

  7. Spring Data JPA 从入门到精通~自定义实现Repository

    EntityManager 的获取方式 我们既然要自定义,首先讲一下 EntityManager 的两种获取方式. 1. 通过 @PersistenceContext 注解. 通过将 @Persist ...

  8. Spring Data JPA 从入门到精通~EntityManager介绍

    EntityManager 介绍 我们前面已经无数次提到了,JPA 的默认 Repository 的实现类是 SimpleJpaRepository,而里面的具体实现就是调用的 EntityManag ...

  9. Spring Data JPA 从入门到精通~JpaSpecificationExecutor示例

    新建两个实体 @Entity(name = "UserInfoEntity") @Table(name = "user_info", schema = &quo ...

最新文章

  1. P3366 【模板】最小生成树(链式前向星,prim,有坑)难度⭐⭐
  2. C#如何判断线程池中所有的线程是否已经完成(转)
  3. python 手机测试_python脚本如何测试手机
  4. 五阶行列式的对角线之和,函数实现
  5. DDD理论学习系列(11)-- 工厂
  6. C语言中auto,register,extern,static【转】
  7. hfss和matlab,matlab-hfss联合仿真教程(初学)--第一节(利用MATLAB编写脚本建立HFSS工程)...
  8. 这可能是最全的JAVA入门教程 ~
  9. 基于java的图书管理系统(英文)
  10. android 不压缩保存图片格式,Android图片处理——压缩、剪裁、圆角、保存
  11. Android音视频——Libyuv使用实战
  12. 如何应用计算机键盘截图,计算机屏幕截图的键盘快捷键是哪个键?在计算机上截图的方法...
  13. 7-14 电话聊天狂人
  14. android 常用URI
  15. java 开发脚本视频_你写脚本,AI自动剪视频:13分钟完成剪辑师7小时创作
  16. 详解 Flink Metrics 原理与监控实战
  17. 虚拟机上部署Envoy Gateway:(一)创建虚拟机
  18. css让table表格上下左右居中的样式
  19. python 如何使用正则表达式
  20. React+echarts+antd实现折线图

热门文章

  1. 美团数据平台Kerberos优化实战
  2. 论文浅尝 - WSDM20 | 基于弱监督及逐步推理的多关系知识图谱问答
  3. 金融行业如何用大数据构建精准用户画像?
  4. Science | 再创生命奇迹!日本科学家造出了不需要“父亲”的大鼠及小鼠
  5. Postman使用小教程--基础入门篇
  6. 12月25晚-12月29日做的两个网页
  7. 关于字节对齐以及内存占用
  8. transition的唧唧歪歪
  9. BZOJ 2150: 部落战争 最大流
  10. swift开发体验,论objective-c与swift的选择