之前的想法是賦值的話是(無論是循環還是流式操作)在循環裏面搜索完賦值,這是新手範的通病,建議不要再循環裏面搜索賦值,這樣的性能很差勁。
優化後的方法:結合本次業務 利用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);
}