上篇文章提到過在JPA中調用Mysql分頁的存儲過程,經過查找資料,發現JPA中有@NamedStoredProcedureQuery註解來專門處理JPA對存儲過程的調用,幷包含了對存儲過程中IN、OUT、INOUT參數的處理。現整合了一個 SpringBoot + JPA + fastJSON 的Demo,實現了對Mysql存儲過程的調用。用fastJSON 純屬爲了將返回的分頁數據封裝成類似JPA中的Page返回類型。
實體類:
@Entity @Table(name = "people") @NamedStoredProcedureQuery( name = "proc_page", procedureName = "proc_page", parameters = { @StoredProcedureParameter(mode = ParameterMode.IN, name = "tab",type = String.class), @StoredProcedureParameter(mode = ParameterMode.INOUT, name = "startItem",type = Integer.class), @StoredProcedureParameter(mode = ParameterMode.INOUT, name = "size",type = Integer.class), @StoredProcedureParameter(mode = ParameterMode.INOUT, name = "sortRule",type = String.class), @StoredProcedureParameter(mode = ParameterMode.IN, name = "order_field",type = String.class), @StoredProcedureParameter(mode = ParameterMode.OUT,name = "totalElements",type= Integer.class), @StoredProcedureParameter(mode = ParameterMode.OUT,name = "pageCount",type = Integer.class ), @StoredProcedureParameter(mode = ParameterMode.OUT,name = "isFirst",type = String.class ), @StoredProcedureParameter(mode = ParameterMode.OUT,name = "isLast",type = String.class )})
Service層:
@PersistenceContext private EntityManager entityManager; public JSONObject Page(JSONObject code){ //模仿JPA中 返回值爲Page類型 的參數類型,封裝成JSONObject 並返回 String tableName = code.getString("Name"); int start = code.getInteger("start"); int size = code.getInteger("size"); String order_by = code.getString("sort_Rule"); String order_field = code.getString("order_field"); //此處參數需與實體類中對應 StoredProcedureQuery query = entityManager.createNamedStoredProcedureQuery("proc_page") .setParameter("tab",tableName) .setParameter("startItem",start) .setParameter("size",size) .setParameter("sortRule",order_by) .setParameter("order_field",order_field); List list = query.getResultList(); query.execute(); //通過getOutputParameterValue方法獲取存儲過程中的OUT參數值 int pageCount = (int) query.getOutputParameterValue("pageCount"); int number = (int) query.getOutputParameterValue("startItem"); int Size = (int) query.getOutputParameterValue("size"); String sort = (String) query.getOutputParameterValue("sortRule"); int totalElements =(int) query.getOutputParameterValue("totalElements"); String isFirst = (String) query.getOutputParameterValue("isFirst"); String isLast = (String) query.getOutputParameterValue("isLast"); if (sort.equals (null) || sort == ""){ //該處純屬爲了模仿 JPA 中 Page 返回的參數類型 sort = "null"; } //將返回參數put進JSONObject,一併返回 JSONObject jsonObject = new JSONObject(); jsonObject.put("totalPage",pageCount); jsonObject.put("totalElements",totalElements); jsonObject.put("number",number); jsonObject.put("size",Size); jsonObject.put("sort",sort); jsonObject.put("isFirst",isFirst); jsonObject.put("isLast",isLast); jsonObject.put("content",list); return jsonObject; }Controller層:
@Autowired private ProcedureService service; @RequestMapping(value = "/findAll",method = RequestMethod.POST) public JSONObject findAll(@RequestBody JSONObject code){ Long start = System.currentTimeMillis(); JSONObject object = service.Page(code); Long end = System.currentTimeMillis(); System.out.println("存儲過程分頁用時:" + (end - start) + "ms"); return object; }
本人是用的Swagger進行測試的,同樣的數據下,測試結果和JPA的分頁速度相差無幾,稍微快上那麼一丟丟,5毫秒以內。至於該Demo中的存儲過程,用的是上一篇博文中的。