之前的想法是赋值的话是(无论是循环还是流式操作)在循环里面搜索完赋值,这是新手范的通病,建议不要再循环里面搜索赋值,这样的性能很差劲。
优化后的方法:结合本次业务 利用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);
}