spring data jpa 调用存储过程
2016-01-20 17:10
267 查看
网上这方面的例子不是很多,研究了一下,列出几个调用的方法.
假如我们有一个mysql的存储过程
就是传入一个int参数,返回这个参数+1.
如果我们要调用这个存储过程的话.可以这么做.
随便找一个entity就可以了如果有多个存储过程,可以用@NamedStoredProcedureQueries就像我上面一样.如果只有1个存储过程,可以用@NamedStoredProcedureQuery代替@NamedStoredProcedureQueries.
@StoredProcedureParameter 是用来标注存储过程的参数的..没啥特别的.只是要注意name和数据库里的参数名字一样.
@NamedStoredProcedureQuery里面procedureName 也要与数据库中存储过程的名字一样.而name可以自己取值,与数据库没有关系
entity A对应的repository里有多中方法都可以找到那个存储过程
上面4个方法中只有
这个方法不行,其他3种方法都可以..其实我觉得alias1应该也是可以的...不知道是不是bug....
用上面这个方法的话方法名要与存储过程名一样.
用alias1这个方法的话会报错.可以考虑改成alias3那种方法.为方法的参数增加@Param注解,就不会报错了.(我觉得这是个bug)
上面这种方法的话需要将procedure设置成数据库里存储过程的名字,好处与alias3一样,就是方法名随便自己取,相比plus1inout方法名只能固定,更灵活一些.
感觉以上3种可行的方法里第一种最简单..什么注解的属性都不用写..唯一要求的就是方法的名字与存储过程名字一样.
假如我们有一个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 调用存储过程还是比较简单的.但是如果存储过程返回一个结果集的话好像不能很好的处理..(看了很多参考.都没有什么好的解决办法..后续有新发现再更新)相关文章推荐
- eclipse上搭建maven多模块Java Web项目
- JavaMelody初使用
- WEB实现Excel下载的一种方式--JAVA EXCEL
- 如何利用Spring Cloud构建起自我修复型分布式系统(1)
- eclipse 查看class 所属jar包
- 【struts2】action中使用通配符
- 移位运算符中关于java编程思想中关于后侧的5个低位的意思:
- Java的浅拷贝和深拷贝
- 浅谈Java中的hashcode方法
- J2EE引擎出现java.lang.UnsatisfiedLinkError: CC错误的原因
- Spring整合JMS(二)——三种消息监听器
- Spring监听配置的几种方式
- HeadFirst Java 1-20
- Java代码发送邮件
- springboot备用记录
- java.util.ConcurrentModificationException异常解决
- MyEclipse使用技巧之通过断点看值是否存入action中
- Error:java: Compilation failed: internal java compiler error
- java基础知识点梳理2
- java.lang.OutOfMemoryError: PermGen space 解决办法