java - 将控制器端点映射到 Spring JPA 层
问题描述
我已经编写了这个请求映射来通过它的 id 使用可选的请求参数 ticketType 和 ticketStatus 来访问票证:
@GetMapping(path = "/tickets/{ticketId}")
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<List<TicketResponse>> getTicketsById(@PathVariable("ticketId") final Long ticketId, @RequestParam("ticketType") final String ticketType, @RequestParam("ticketStatus") final String ticketStatus)
目前,存储库包含基于 ticketId 或 ticketState 的返回方法:
@Repository
public interface TicketRepository extends JpaRepository<TicketEntity, Long> {
Stream<TicketEntity> findByTicketIdAndTicketState(@Param("ticketId") Long ticketId);
Stream<TicketEntity> findByTicketIdAndTicketState(@Param("ticketId") Long ticketId, @Param("ticketState") String ticketState);
}
这些端点应该如何在控制器层公开?
目前端点是:
@GetMapping(path = "/{ticketId}")
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<List<TicketResponse>> getTicketsByTicketId(
@PathVariable("productId") final Long ticketId, @RequestParam(name = "ticketState", required=false) final String ticketState) {
final List<TicketResponse> ticketsByTicketId = ticketService.getTicketsByTicketId(ticketId);
if(ticketsByTicketId.size() == 0){
return ResponseEntity.ok("No tickets found");
}
else {
return ResponseEntity.ok(ticketsByTicketId);
}
}
我应该添加一个新端点吗?:
或者更新控制器以根据查询选择要实现的 JPA 存储库方法?:
@GetMapping(path = "/{ticketId}")
@ResponseStatus(value = HttpStatus.OK)
public ResponseEntity<List<TicketResponse>> getTicketsByTicketId(
@PathVariable("productId") final Long ticketId, @RequestParam(name = "ticketState", required=false) final String ticketState) {
List<TicketResponse> tickets = null;
if(ticketState == null) {
tickets = ticketService.getTicketsByTicketId(ticketId);
}
else{
tickets = ticketService.getTicketsByTicketIdAndTicketState(ticketId, ticketState);
}
if(ticketsByTicketId.size() == 0){
return ResponseEntity.ok("No tickets found");
}
else {
return ResponseEntity.ok(ticketsByTicketId);
}
}
JPA 存储库将进一步扩展,以基于更多参数(例如 ticketType、ticketDescription )进行过滤。我只是提到这一点,因为如果需要检查哪个参数为空并选择相关的 JPA 查询,我的控制器逻辑将变得非常复杂。
解决方案
使用 Spring Data JPA 规范可以解决这个地图过滤问题。可以使用 Criteria API 构建复杂查询,具体取决于过滤参数。
推荐阅读
- .net-core - MassTransit SignalR 绑定
- google-cloud-platform - 如何通过 MQL 获取 GCP 计算虚拟机实例的正常运行时间总数和百分比?
- qt - QML:列表代表之间的分隔符
- python - 在 swig 生成的 python 接口中使用 std::vector 成员变量作为列表
- cloudflare - 如何使用 Wasabi 和 Cloudflare 调整图像大小?
- python - 如何根据节点坐标及其连接数据在 Abaqus inp 文件中重建 Python/Matlab 中的网格?
- javascript - 如何在 vue echarts 中添加自定义图例(不在系列中)并启用切换以切换系列中的其他图例?
- node.js - 帮助寻找朋友机器人
- javascript - OPTIONAL CHAINING 和 NULLISH COALESCING 运算符的组合未呈现预期结果
- netlify - 如何使用 GitHub 安装 Netlify