1. 程式人生 > 其它 >jpa中分組統計分頁查詢

jpa中分組統計分頁查詢

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;

}