循環中套查詢優化

之前的想法是賦值的話是(無論是循環還是流式操作)在循環裏面搜索完賦值,這是新手範的通病,建議不要再循環裏面搜索賦值,這樣的性能很差勁。
優化後的方法:結合本次業務 利用map集合 key存儲主鍵 value存儲數量

Repository:

 /**
     * 查詢創建人創建每個分組的人數集合
     * @param usrPid 創建人pid
     * @return
     */
    @Query("SELECT\n" +
            "model.pid,\n" +
            "COUNT(guser.groupDetailsPid)\n" +
            "FROM\n" +
            "GroupDetails model\n" +
            "LEFT JOIN GroupDetailsUser guser ON model.pid = guser.groupDetailsPid \n" +
            "WHERE\n" +
            "model.userPid = :usrPid\n" +
            "GROUP BY\n" +
            "model.pid")
    Stream<Object[]> userNum(String usrPid);

Service層

/**
     * 查詢創建人創建每個分組的人數Map集合 String分組主鍵
     * @param usrPid 創建人pid
     * @return
     */
    @Transactional(readOnly = true)
    public Map<String,Long> userNum(String usrPid) {
        Map<String, Long> map = repository.userNum(usrPid)
                .collect(Collectors.toMap(arr->(String) arr[0], arr -> (long) arr[1]));
        return map;
    }

Controller層

涉及的代碼:

Map<String, Long> countUsrs = service.userNum(getOperatorId());

 Page<GroupDetailsDTO> dataDto = data.map(groupDetails -> new GroupDetailsDTO(
                groupDetails.getPid(),
                groupDetails.getOrgPid(),
                groupDetails.getUserPid(),
                groupDetails.getGroupName(),
                groupDetails.getCreateTime(),
                groupDetails.getGroupDesc(),
                countUsrs.get(groupDetails.getPid())
        ));

全部代碼

/**
     * 分頁顯示教師創建的分組
     * @param page
     * @param title 分組名稱,默認值爲""
     * @param startTime 起始時間
     * @param endTime 結束時間
     * @return
     */
    @GetMapping({"/group/details"})
    public ResponseEntity findAllByPage(@PageableDefault Pageable page,
                                        @RequestParam(required = false) String title,
                                        @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startTime,
                                        @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endTime) {
        if (startTime != null && endTime != null && startTime.isAfter(endTime)) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(Translator.toLocale("group.time.Failed.message"));
        }
        LocalDateTime startLocalDateTime = null;
        LocalDateTime endLocalDateTime = null;
        if (startTime != null || endTime != null) {
            startLocalDateTime = LocalDateTime.of(startTime, LocalTime.of(0, 0));
            endLocalDateTime = LocalDateTime.of(endTime, LocalTime.of(23, 59));
        }
        Map<String, Long> countUsrs = service.userNum(getOperatorId());
        Page<GroupDetails> data = service.findAllByPage(getOperatorId(), title, startLocalDateTime, endLocalDateTime, page);
        Page<GroupDetailsDTO> dataDto = data.map(groupDetails -> new GroupDetailsDTO(
                groupDetails.getPid(),
                groupDetails.getOrgPid(),
                groupDetails.getUserPid(),
                groupDetails.getGroupName(),
                groupDetails.getCreateTime(),
                groupDetails.getGroupDesc(),
                countUsrs.get(groupDetails.getPid())
        ));
        return ResponseEntity.ok(dataDto);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章