网上这方面的例子不是很多,研究了一下,列出几个调用的方法.

假如我们有一个mysql的存储过程

  1. CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT)
  2. BEGIN
  3. SET res = ARG + 1;
  4. END

就是传入一个int参数,返回这个参数+1.

如果我们要调用这个存储过程的话.可以这么做.

标注entity

  1. package com.labofjet.entity;
  2.  
  3. import javax.persistence.Embedded;
  4. import javax.persistence.EmbeddedId;
  5. import javax.persistence.Entity;
  6. import javax.persistence.NamedStoredProcedureQueries;
  7. import javax.persistence.NamedStoredProcedureQuery;
  8. import javax.persistence.ParameterMode;
  9. import javax.persistence.StoredProcedureParameter;
  10.  
  11. @Entity
  12. @NamedStoredProcedureQueries({
  13. @NamedStoredProcedureQuery(name = "User.plus1", procedureName = "plus1inout", parameters = {
  14. @StoredProcedureParameter(mode = ParameterMode.IN, name = "arg", type = Integer.class),
  15. @StoredProcedureParameter(mode = ParameterMode.OUT, name = "res", type = Integer.class) }),
  16. @NamedStoredProcedureQuery(name = "User.mytest", procedureName = "mytest") })
  17. public class A {
  18. @EmbeddedId
  19. APK id;
  20.  
  21. String age;
  22.  
  23. @Embedded
  24. AComponent acomponent;
  25.  
  26. public AComponent getAcomponent() {
  27. return acomponent;
  28. }
  29.  
  30. public void setAcomponent(AComponent acomponent) {
  31. this.acomponent = acomponent;
  32. }
  33.  
  34. public String getAge() {
  35. return age;
  36. }
  37.  
  38. public void setAge(String age) {
  39. this.age = age;
  40. }
  41.  
  42. public APK getId() {
  43. return id;
  44. }
  45.  
  46. public void setId(APK id) {
  47. this.id = id;
  48. }
  49.  
  50. @Override
  51. public int hashCode() {
  52. // TODO Auto-generated method stub
  53. System.out.println("Ahash");
  54. return super.hashCode();
  55. }
  56.  
  57. @Override
  58. public boolean equals(Object obj) {
  59. // TODO Auto-generated method stub
  60. System.out.println("Aequals");
  61. return super.equals(obj);
  62. }
  63. }

随便找一个entity就可以了如果有多个存储过程,可以用@NamedStoredProcedureQueries就像我上面一样.如果只有1个存储过程,可以用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.

@StoredProcedureParameter 是用来标注存储过程的参数的..没啥特别的.只是要注意name和数据库里的参数名字一样.

@NamedStoredProcedureQuery里面procedureName 也要与数据库中存储过程的名字一样.而name可以自己取值,与数据库没有关系

标注repository的方法

  1. package com.labofjet.repository;
  2.  
  3. import java.util.List;
  4.  
  5. import org.springframework.data.jpa.repository.JpaRepository;
  6. import org.springframework.data.jpa.repository.query.Procedure;
  7. import org.springframework.data.repository.query.Param;
  8. import org.springframework.stereotype.Repository;
  9.  
  10. import com.labofjet.entity.A;
  11. import com.labofjet.entity.APK;
  12.  
  13. @Repository
  14. public interface ARepository extends JpaRepository<A, APK>{
  15.  
  16. @Procedure
  17. Integer plus1inout(Integer arg);
  18.  
  19. @Procedure(name="plus1")
  20. Integer alias1(Integer arg);
  21.  
  22. @Procedure(procedureName="plus1inout")
  23. Integer alias2(Integer arg);
  24.  
  25. @Procedure(name="User.plus1")
  26. Integer alias3(@Param("arg")Integer argAlias);
  27.  
  28. @Procedure
  29. Object[] mytest();
  30. }

entity A对应的repository里有多中方法都可以找到那个存储过程

  1. @Procedure
  2. Integer plus1inout(Integer arg);
  3.  
  4. @Procedure(name="plus1")
  5. Integer alias1(Integer arg);
  6.  
  7. @Procedure(procedureName="plus1inout")
  8. Integer alias2(Integer arg);
  9.  
  10. @Procedure(name="User.plus1")
  11. Integer alias3(@Param("arg")Integer argAlias);

上面4个方法中只有

  1. Integer alias1(Integer arg);

这个方法不行,其他3种方法都可以..其实我觉得alias1应该也是可以的...不知道是不是bug....

  1. @Procedure
  2. Integer plus1inout(Integer arg);

用上面这个方法的话方法名要与存储过程名一样.

  1. @Procedure(name="plus1")
  2. Integer alias1(Integer arg);

用alias1这个方法的话会报错.可以考虑改成alias3那种方法.为方法的参数增加@Param注解,就不会报错了.(我觉得这是个bug)

  1. @Procedure(procedureName="plus1inout")
  2. Integer alias2(Integer arg);

上面这种方法的话需要将procedure设置成数据库里存储过程的名字,好处与alias3一样,就是方法名随便自己取,相比plus1inout方法名只能固定,更灵活一些.

感觉以上3种可行的方法里第一种最简单..什么注解的属性都不用写..唯一要求的就是方法的名字与存储过程名字一样.

其他

感觉spring data jpa 调用存储过程还是比较简单的.但是如果存储过程返回一个结果集的话好像不能很好的处理..(看了很多参考.都没有什么好的解决办法..后续有新发现再更新)

spring data jpa 调用存储过程的更多相关文章

  1. Spring data jpa 调用存储过程处理返回参数及结果集

    一.环境 1.此随笔内容基于spring boot整合的spring data jpa项目, 2.数据库为mysql 5.7.9版本 二.内容 1. 新建存储过程 pro_query_object B ...

  2. Hibernate、Mybatis与Spring Data JPA

    从零开始集成Springboot+MyBatis+JPA https://www.jianshu.com/p/e14c4a6f6871 MyBatis 与Hibernate的区别 http://xhr ...

  3. spring boot + spring data jpa

    Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道 ...

  4. 【Spring】Spring Data JPA

    原始JDBC操作数据库 传统JDBC方式实现数据库操作 package com.imooc.util; import java.io.InputStream; import java.sql.*; i ...

  5. spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  6. Spring Data JPA 和MyBatis比较

    现在Dao持久层的解决方案中,大部分是采用Spring Data JPA或MyBatis解决方案,并且传统企业多用前者,互联网企业多用后者. Spring Data JPA 是Spring Data ...

  7. 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  8. Spring Data Jpa (四)注解式查询方法

    详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...

  9. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

随机推荐

  1. Linux:常用命令

    文件压缩.解压 网络.进程 磁盘.文件使用情况 内存使用 1.文件压缩.解压 1)tar.gz文件解压: .bin.tar.gz 解压到指定目录: (指定的目录是存在的) .bin. 2)zip 文件 ...

  2. 2.快速部署MySQL主从复制

      1.快速部署MySQL主从复制 [root@mysql ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock -e "show slave ...

  3. [笔记]linux磁盘管理

    sudo mount -r /dev/sda3 /mnt/vista 只读挂载 sudo umount sudo umount -r 无法卸载时只读重新挂载 mount -t(指明设备类型) 可用参数 ...

  4. SVN“验证位置时发生错误”的解决办法

    验证位置时发生错误:“org.tigris.subversion.javahl.ClientException...... 验证位置时发生错误:“org.tigris.subversion.javah ...

  5. [转][iOS]NSHash​Table & NSMap​Table

    NSSet and NSDictionary, along with NSArray are the workhorse collection classes of Foundation. Unlik ...

  6. MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)

    人工智能(AI)中往往都会有这么一个问题,那就是我要做什么?我该怎么做?我需要什么?所以这里所谓的智能就是赋予AI对象的判断力,以及它根据判断得到的相应反应.就好比,你去商店买东西,钱够别人才卖给你, ...

  7. UICollectionLayout布局 —— UIKit之学习UICollectionView记录二《流水布局》

    重点知识 一. 加载collectionView注意事项 1.创建collectionView,有两种方式 :一种是xib和一种是纯代码:设置代理和数据源,注册cell,配置流水布局的属性,如上.下. ...

  8. Stack操作,栈的操作。

    栈是先进后出,后进先出的操作. 有点类似浏览器返回上一页的操作, public class Stack<E>extends Vector<E> 是vector的子类. 常用方法 ...

  9. [LeetCode] Paint House II 粉刷房子之二

    There are a row of n houses, each house can be painted with one of the k colors. The cost of paintin ...

  10. java sound初探

    网上关于java sound的正规资源讲解的非常好,本文不再给出示例,主要提供一些好的资源,并说说我的一些理解,用于形成对java sound的整体认识. 一.几个词汇 TTS:text-to-spe ...