zoukankan      html  css  js  c++  java
  • 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 调用存储过程还是比较简单的.但是如果存储过程返回一个结果集的话好像不能很好的处理..(看了很多参考.都没有什么好的解决办法..后续有新发现再更新)

  • 相关阅读:
    拜访优达学城上海总部
    ipad pro 文章
    探寻阿里云服务器迈入2.0时代的技术要点
    体验阿里云SSD云盘+ECS(I/O优化)的性能
    在iOS中使用OpenSSL的Public Key 进行加密
    使用FIR.im发布自己的移动端APP
    使用AFNetWorking 实现以Basic Authentication方式获取access-token
    使用AFNetWorking读取JSON出现NSCocoaErrorDomain Code=3840的解决方法
    #听云博客大赛#如何在自己的App嵌入听云产品监控App性能
    给自己的XTC820摆拍一下。
  • 原文地址:https://www.cnblogs.com/abcwt112/p/5145870.html
Copyright © 2011-2022 走看看