如何在SpringBoot中不使用联表查询从Leave与CompOff表获取数据并合并为员工请求列表返回前端
整合Leave和CompOff数据返回统一请求列表的解决方案
嗨,我来帮你搞定这个在SpringBoot里整合请假(Leave)和补休(CompOff)数据的问题!咱们可以通过统一转换为Request对象+合并列表的方式来实现,一步步来:
1. 先调整Request实体类
首先,咱们的Request类需要能容纳两种请求的共同信息,还要能区分请求类型。建议给它加上这些字段:
empid:员工IDcreatedOn:请求创建时间requestType:请求类型(比如"LEAVE"或"COMP_OFF",方便前端区分)
示例代码:
public class Request { private Long empid; private LocalDate createdOn; private String requestType; // 构造器、getter、setter public Request(Long empid, LocalDate createdOn, String requestType) { this.empid = empid; this.createdOn = createdOn; this.requestType = requestType; } // 省略getter和setter }
另外注意:你的数据库字段写的是ceated_on,应该是拼写错误,建议改成created_on,同时Leave和CompOff实体类里对应的字段也要修正(比如用@Column(name = "created_on")做数据库映射)。
2. 定义数据访问层(Repository)
给Leave和CompOff分别创建JpaRepository,用来获取对应表的数据:
// LeaveRepository public interface LeaveRepository extends JpaRepository<Leave, Long> { // 可选:按员工ID查询请假记录 List<Leave> findByEmpid(Long empid); } // CompOffRepository public interface CompOffRepository extends JpaRepository<CompOff, Long> { // 可选:按员工ID查询补休记录 List<CompOff> findByEmpid(Long empid); }
3. 业务层实现数据整合
在业务类(比如RequestService)里,咱们要完成三件核心事:
- 从两个Repository拉取原始数据
- 把Leave和CompOff对象分别转换成统一的Request对象
- 合并两个列表(还可以按创建时间排序,提升前端展示体验)
示例代码:
@Service public class RequestService { @Autowired private LeaveRepository leaveRepository; @Autowired private CompOffRepository compOffRepository; // 获取所有员工的请求列表 public List<Request> getAllRequests() { // 转换请假数据为Request对象 List<Request> leaveRequests = leaveRepository.findAll().stream() .map(leave -> new Request( leave.getEmpid(), leave.getCreatedOn(), "LEAVE" )) .collect(Collectors.toList()); // 转换补休数据为Request对象 List<Request> compOffRequests = compOffRepository.findAll().stream() .map(compOff -> new Request( compOff.getEmpid(), compOff.getCreatedOn(), "COMP_OFF" )) .collect(Collectors.toList()); // 合并列表并按创建时间倒序排序(最新请求在前) return Stream.concat(leaveRequests.stream(), compOffRequests.stream()) .sorted(Comparator.comparing(Request::getCreatedOn).reversed()) .collect(Collectors.toList()); } // 可选:获取单个员工的请求列表 public List<Request> getRequestsByEmpid(Long empid) { List<Request> leaveRequests = leaveRepository.findByEmpid(empid).stream() .map(leave -> new Request(leave.getEmpid(), leave.getCreatedOn(), "LEAVE")) .collect(Collectors.toList()); List<Request> compOffRequests = compOffRepository.findByEmpid(empid).stream() .map(compOff -> new Request(compOff.getEmpid(), compOff.getCreatedOn(), "COMP_OFF")) .collect(Collectors.toList()); return Stream.concat(leaveRequests.stream(), compOffRequests.stream()) .sorted(Comparator.comparing(Request::getCreatedOn).reversed()) .collect(Collectors.toList()); } }
4. 控制器层提供接口给前端
写一个RestController,暴露接口让前端获取整合后的请求列表:
@RestController @RequestMapping("/api/requests") public class RequestController { @Autowired private RequestService requestService; // 获取所有请求 @GetMapping public ResponseEntity<List<Request>> getAllRequests() { List<Request> requests = requestService.getAllRequests(); return ResponseEntity.ok(requests); } // 获取指定员工的请求 @GetMapping("/{empid}") public ResponseEntity<List<Request>> getRequestsByEmpid(@PathVariable Long empid) { List<Request> requests = requestService.getRequestsByEmpid(empid); return ResponseEntity.ok(requests); } }
这样前端调用接口后,就能拿到包含请假和补休的统一请求列表,每个条目都能通过requestType区分类型,还按时间排好序啦!
内容的提问来源于stack exchange,提问作者Harshit
相关产品推荐
相关产品推荐

