1、環境java
1.此隨筆內容基於spring boot整合的spring data jpa項目,mysql
2.數據庫爲mysql 5.7.9版本 spring
2、內容sql
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 註解綁定存儲過程this
-
@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 內可寫多個存儲過程,使用「,」隔開;
@NamedStoredProcedureQuery
中
procedureName參數是數據庫中存儲過程的名字;- 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 參數