循环中套查询优化
之前的想法是賦值的話是(無論是循環還是流式操作)在循環里面搜索完賦值,這是新手范的通病,建議不要再循環里面搜索賦值,這樣的性能很差勁。
優化后的方法:結合本次業務 利用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);}總結
- 上一篇: JpaSpecificationExec
- 下一篇: : Content type 'text