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 調用存儲過程還是比較簡單的.但是如果存儲過程返回一個結果集的話好像不能很好的處理..(看了很多參考.都沒有什么好的解決辦法..后續有新發現再更新)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM