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

假如我们有一个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 调用存储过程的更多相关文章

  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. 15天玩转redis —— 第九篇 发布/订阅模式

    本系列已经过半了,这一篇我们来看看redis好玩的发布订阅模式,其实在很多的MQ产品中都存在这样的一个模式,我们常听到的一个例子 就是邮件订阅的场景,什么意思呢,也就是说100个人订阅了你的博客,如果 ...

  2. 《Ansible权威指南》笔记(1)——安装,ssh密钥登陆,命令

    2016-12-23 读这本<Ansible权威指南>学习ansible,根据本书内容和网上的各种文档,以及经过自己测试,写出以下笔记.另,这本书内容很好,但印刷错误比较多,作者说第二版会 ...

  3. jquery $.each终止本次循环

    1.for循环中我们使用continue:终止本次循环计入下一个循环,使用break终止整个循环. 2.而在jquery中 $.each则对应的使用return true 进入下一个循环,return ...

  4. QC在win7下不能访问QC服务器介绍

    本地访问不了服务器QC的主要几个原因总结 服务器serverjbossextensionhpcmd 2016-03-24   兼容性问题: 1.在服务端QC的安装目录下jboss\server\def ...

  5. Lua面线对象学习

    --[[ ]] local userdata = {} local Register = {} function Register:del(key) userdata[self.namespace][ ...

  6. redux-observable笔记

    欢迎指导与讨论:) 前言 本文不涉及深入的知识,只是在概念层面和一个简单的例子解释redux-observable的工作原理. redux-observable,是redux的一个中间件库.它能够自动 ...

  7. thrift:swift项目笔记

    先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...

  8. dubbox升级spring到4.x及添加log4j2支持

    今天花了点时间,把dubbox依赖的spring从3.x升级成最新版的4.x了,其它一些依赖的组件也顺带升级了,同时dubbo支持的第三方日志组件居然没有log4j2,加了点代码也一并支持了,蛋疼的是 ...

  9. PHP 原创视频教程-网站开发新手视频教程

    PHP 原创视频教程-网站开发新手视频教程 有偿招徒弟,,视频免费提供. 本视频教程,面向的是毫无经验的新手,快速上手的. 第一次做视频做的不好的,请各位看官多多包含. 第一部分,HTML 视频教程 ...

  10. [LeetCode] Pascal's Triangle II 杨辉三角之二

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...