jpa中分組統計分頁查詢
阿新 • • 發佈:2021-02-02
public PageDTO findSettlementReport(SettlementRequestBody request){
String activityId = request.getActivityId(); //這是因為我再查詢的時候是根據活動id進行查詢的 需要在返回 這樣在翻頁的時候才不會重置查詢結果 //criteriaBuilder用於構建CriteriaQuery的構建器物件 CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); //criteriaQuery包含查詢語句的各個部分,如where、max、sum、groupBy、orderBy等 CriteriaQuery<SettlementReportDTO> criteriaQuery = criteriaBuilder.createQuery(SettlementReportDTO.class); //獲取查詢例項的屬性, Root<Settlement> root = criteriaQuery.from(Settlement.class); //相當於select 與 from之間的部分 criteriaQuery.multiselect(root.get("floor"),root.get("storeId") ,root.get("storeNumber"), root.get("storeName"), criteriaBuilder.sum(root.get("price")), criteriaBuilder.sum(root.get("truePrice")),criteriaBuilder.sum(root.get("servicePrice")), root.get("activityMoney"),criteriaBuilder.sum(root.get("marketPrice")),criteriaBuilder.sum(root.get("returnPrice")) ); if (StringUtil.isNotEmpty(activityId)){//where criteriaQuery.where(criteriaBuilder.equal(root.get("activityId"), request.getActivityId())); } //group by criteriaQuery.groupBy(root.get("activityId"),root.get("storeId")); //記錄當前sql查詢結果總條數 List<SettlementReportDTO> counts = entityManager.createQuery(criteriaQuery).getResultList(); //sql查詢物件 TypedQuery<SettlementReportDTO> createQuery = entityManager.createQuery(criteriaQuery); //這一步是設定分頁 createQuery.setFirstResult(request.getPage()*request.getSize());//展示頁面的結果 createQuery.setMaxResults(request.getSize()); //最大條數 List<SettlementReportDTO> resultList = createQuery.getResultList(); for (SettlementReportDTO reportDTO:resultList) { //下面是條件判空後,將查詢的結果進行計算 視實際情況 可以刪掉 //卡費用 Double aDouble = cardRecordRepository.sumCardprice(reportDTO.getStoreId()); if (aDouble == null){ reportDTO.setCardPrice(0.0); }else { reportDTO.setCardPrice(aDouble); } Integer activityMoney = reportDTO.getActivityMoney(); if(activityMoney == null){ reportDTO.setSumReturnPrice(reportDTO.getSumReturnPrice()-reportDTO.getCardPrice()); }else{ reportDTO.setSumReturnPrice(reportDTO.getSumReturnPrice()-reportDTO.getCardPrice()-activityMoney); } Date date = new Date(); reportDTO.setData(DateUtils.dateToString(date, DateUtils.TIMESTAMP)); } int totalpage=counts.size()%request.getSize()==0?counts.size()/request.getSize():counts.size()/request.getSize()+1; PageDTO<SettlementReportDTO> pageDTO = new PageDTO<>(); pageDTO.setTotal((long) counts.size()); //總條數 pageDTO.setList(resultList);//結果集 pageDTO.setTotalPage(totalpage);//總頁數 pageDTO.setPage(request.getPage());//當前頁 pageDTO.setPageSize(request.getSize());//當前頁條數 pageDTO.setActivityId(activityId);//查詢條件 見 第一步 return pageDTO; }