Spring data jpa 調用存儲過程處理返回參數及結果集


一、環境

 1.此隨筆內容基於spring boot整合的spring data jpa項目,

 2.數據庫為mysql 5.7.9版本 

二、內容

1. 新建存儲過程 pro_query_object

BEGIN

       #Routine body goes here...a_theme_code varchar(10),out num int

 select o.obj_code,o.obj_name,o.obj_id from qt_object o where o.theme_code=a_theme_code;

select count(*) into num from qt_object o where o.theme_code=a_theme_code GROUP BY o.theme_code;

END 

  

2. 新建實體,首先把我們需要返回的結果集的實體字段定義好,然后加上@NamedStoredProcedureQueries 注解綁定存儲過程

  • @Entity
    @NamedStoredProcedureQueries({
            //管理列表
            @NamedStoredProcedureQuery(name = "pro_general_list", procedureName = "pro_general_list",
                    resultClasses = { QtObject.class },
                    parameters = {
                            @StoredProcedureParameter(mode = ParameterMode.IN, name = "a_theme_code", type = String.class),
                            @StoredProcedureParameter(mode = ParameterMode.OUT, name = "num", type = Integer.class)  // 記錄滿足條件的總條數
                     }),
    })
    public class QtObject {
        @Id
        @Column(name = "obj_id")
        private String objId;
        private String obj_code;
        private String obj_name; 
    // 此處省略get、set
    }
    

      


    此處:
  • @NamedStoredProcedureQueries 內可寫多個存儲過程,使用“,”隔開;
  • @NamedStoredProcedureQueryprocedureName參數是數據庫中存儲過程的名字;
  • name參數是JPA中的存儲過程的名字;resultClasses參數是返回結果集綁定的實體名稱(處理結果集重要參數);
  • parameters 中使用@StoredProcedureParameter來定義存儲過程使用的IN、OUT參數
3.完成實體后,我們在編寫調用方法

///  調用存儲過程

public StoredProcedureQuery callStore(String themeCode) {

    StoredProcedureQuery store = this.entityManager.createNamedStoredProcedureQuery("pro_general_list");
      store.setParameter("a_theme_code", themeCode);  
      store.execute();

    return store;

}

  

調用存儲過程時,需要先注入實體管理器EntityManager,調用其中的 createNamedStoredProcedureQuery方法,傳入jpa 的存儲過程名稱,然后只需要傳入in 參數,執行之后返回StoredProcedureQuery對象。
4. 結果處理
public ResultInfo queryInitGeneral(String themeCode) {

    ResultInfo<List> resultInfo = new ResultInfo<List>();

        StoredProcedureQuery storedProcedureQuery= callStore(start_date, end_date,themeCode,deptCode,obj_name,start_num,end_num);

        Integer nums = (Integer)storedProcedureQuery.getOutputParameterValue("num");

        resultInfo.setRows(storedProcedureQuery.getResultList());

        resultInfo.setTotal(nums);

        resultInfo.setResult(1);

        resultInfo.setMsg("查詢成功!");

    return resultInfo;

}

  

在調用過程中,使用StoredProcedureQuery中的getResultList()方法可以返回存儲過程執行之后的結果集(此處的結果集是一個,多個還未實驗);
然后使用storedProcedureQuery的 getOutputParameterValue() 方法可以返回out 參數


免責聲明!

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



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