spring data jpa 调用存储过程
网上这方面的例子不是很多,研究了一下,列出几个调用的方法.
假如我们有一个mysql的存储过程
- CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1inout`(IN ARG INT, OUT res INT)
- BEGIN
- SET res = ARG + 1;
- END
就是传入一个int参数,返回这个参数+1.
如果我们要调用这个存储过程的话.可以这么做.
标注entity
- package com.labofjet.entity;
- import javax.persistence.Embedded;
- import javax.persistence.EmbeddedId;
- import javax.persistence.Entity;
- import javax.persistence.NamedStoredProcedureQueries;
- import javax.persistence.NamedStoredProcedureQuery;
- import javax.persistence.ParameterMode;
- import javax.persistence.StoredProcedureParameter;
- @Entity
- @NamedStoredProcedureQueries({
- @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) }),
- @NamedStoredProcedureQuery(name = "User.mytest", procedureName = "mytest") })
- public class A {
- @EmbeddedId
- APK id;
- String age;
- @Embedded
- AComponent acomponent;
- public AComponent getAcomponent() {
- return acomponent;
- }
- public void setAcomponent(AComponent acomponent) {
- this.acomponent = acomponent;
- }
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- public APK getId() {
- return id;
- }
- public void setId(APK id) {
- this.id = id;
- }
- @Override
- public int hashCode() {
- // TODO Auto-generated method stub
- System.out.println("Ahash");
- return super.hashCode();
- }
- @Override
- public boolean equals(Object obj) {
- // TODO Auto-generated method stub
- System.out.println("Aequals");
- return super.equals(obj);
- }
- }
随便找一个entity就可以了如果有多个存储过程,可以用@NamedStoredProcedureQueries就像我上面一样.如果只有1个存储过程,可以用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.
@StoredProcedureParameter 是用来标注存储过程的参数的..没啥特别的.只是要注意name和数据库里的参数名字一样.
@NamedStoredProcedureQuery里面procedureName 也要与数据库中存储过程的名字一样.而name可以自己取值,与数据库没有关系
标注repository的方法
- package com.labofjet.repository;
- import java.util.List;
- import org.springframework.data.jpa.repository.JpaRepository;
- import org.springframework.data.jpa.repository.query.Procedure;
- import org.springframework.data.repository.query.Param;
- import org.springframework.stereotype.Repository;
- import com.labofjet.entity.A;
- import com.labofjet.entity.APK;
- @Repository
- public interface ARepository extends JpaRepository<A, APK>{
- @Procedure
- Integer plus1inout(Integer arg);
- @Procedure(name="plus1")
- Integer alias1(Integer arg);
- @Procedure(procedureName="plus1inout")
- Integer alias2(Integer arg);
- @Procedure(name="User.plus1")
- Integer alias3(@Param("arg")Integer argAlias);
- @Procedure
- Object[] mytest();
- }
entity A对应的repository里有多中方法都可以找到那个存储过程
- @Procedure
- Integer plus1inout(Integer arg);
- @Procedure(name="plus1")
- Integer alias1(Integer arg);
- @Procedure(procedureName="plus1inout")
- Integer alias2(Integer arg);
- @Procedure(name="User.plus1")
- Integer alias3(@Param("arg")Integer argAlias);
上面4个方法中只有
- Integer alias1(Integer arg);
这个方法不行,其他3种方法都可以..其实我觉得alias1应该也是可以的...不知道是不是bug....
- @Procedure
- Integer plus1inout(Integer arg);
用上面这个方法的话方法名要与存储过程名一样.
- @Procedure(name="plus1")
- Integer alias1(Integer arg);
用alias1这个方法的话会报错.可以考虑改成alias3那种方法.为方法的参数增加@Param注解,就不会报错了.(我觉得这是个bug)
- @Procedure(procedureName="plus1inout")
- Integer alias2(Integer arg);
上面这种方法的话需要将procedure设置成数据库里存储过程的名字,好处与alias3一样,就是方法名随便自己取,相比plus1inout方法名只能固定,更灵活一些.
感觉以上3种可行的方法里第一种最简单..什么注解的属性都不用写..唯一要求的就是方法的名字与存储过程名字一样.
其他
感觉spring data jpa 调用存储过程还是比较简单的.但是如果存储过程返回一个结果集的话好像不能很好的处理..(看了很多参考.都没有什么好的解决办法..后续有新发现再更新)
spring data jpa 调用存储过程的更多相关文章
- Spring data jpa 调用存储过程处理返回参数及结果集
一.环境 1.此随笔内容基于spring boot整合的spring data jpa项目, 2.数据库为mysql 5.7.9版本 二.内容 1. 新建存储过程 pro_query_object B ...
- Hibernate、Mybatis与Spring Data JPA
从零开始集成Springboot+MyBatis+JPA https://www.jianshu.com/p/e14c4a6f6871 MyBatis 与Hibernate的区别 http://xhr ...
- spring boot + spring data jpa
Spring Data Repository的核心接口是Repository(好像也没什么好惊讶的).这个接口需要领域类(Domain Class)跟领域类的ID类型作为参数.这个接口主要是让你能知道 ...
- 【Spring】Spring Data JPA
原始JDBC操作数据库 传统JDBC方式实现数据库操作 package com.imooc.util; import java.io.InputStream; import java.sql.*; i ...
- spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- Spring Data JPA 和MyBatis比较
现在Dao持久层的解决方案中,大部分是采用Spring Data JPA或MyBatis解决方案,并且传统企业多用前者,互联网企业多用后者. Spring Data JPA 是Spring Data ...
- 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- Spring Data Jpa (四)注解式查询方法
详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...
- JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!
序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...
随机推荐
- Linux:常用命令
文件压缩.解压 网络.进程 磁盘.文件使用情况 内存使用 1.文件压缩.解压 1)tar.gz文件解压: .bin.tar.gz 解压到指定目录: (指定的目录是存在的) .bin. 2)zip 文件 ...
- 2.快速部署MySQL主从复制
1.快速部署MySQL主从复制 [root@mysql ~]# mysql -uroot -p123456 -S /data/3307/mysql.sock -e "show slave ...
- [笔记]linux磁盘管理
sudo mount -r /dev/sda3 /mnt/vista 只读挂载 sudo umount sudo umount -r 无法卸载时只读重新挂载 mount -t(指明设备类型) 可用参数 ...
- SVN“验证位置时发生错误”的解决办法
验证位置时发生错误:“org.tigris.subversion.javahl.ClientException...... 验证位置时发生错误:“org.tigris.subversion.javah ...
- [转][iOS]NSHashTable & NSMapTable
NSSet and NSDictionary, along with NSArray are the workhorse collection classes of Foundation. Unlik ...
- MMORPG大型游戏设计与开发(服务器 AI 逻辑设定和状态结点)
人工智能(AI)中往往都会有这么一个问题,那就是我要做什么?我该怎么做?我需要什么?所以这里所谓的智能就是赋予AI对象的判断力,以及它根据判断得到的相应反应.就好比,你去商店买东西,钱够别人才卖给你, ...
- UICollectionLayout布局 —— UIKit之学习UICollectionView记录二《流水布局》
重点知识 一. 加载collectionView注意事项 1.创建collectionView,有两种方式 :一种是xib和一种是纯代码:设置代理和数据源,注册cell,配置流水布局的属性,如上.下. ...
- Stack操作,栈的操作。
栈是先进后出,后进先出的操作. 有点类似浏览器返回上一页的操作, public class Stack<E>extends Vector<E> 是vector的子类. 常用方法 ...
- [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 ...
- java sound初探
网上关于java sound的正规资源讲解的非常好,本文不再给出示例,主要提供一些好的资源,并说说我的一些理解,用于形成对java sound的整体认识. 一.几个词汇 TTS:text-to-spe ...