本文介绍如何在 Spring Boot 应用中实现按需获取用户指定天数前(如前一天、前两天等)的数据库文档数据,通过 REST 接口传递日期偏移量,并结合 JPA/Hibernate 安全高效地查询 dateOfIssue 字段匹配的记录。
本文介绍如何在 spring boot 应用中实现按需获取用户指定天数前(如前一天、前两天等)的数据库文档数据,通过 rest 接口传递日期偏移量,并结合 jpa/hibernate 安全高效地查询 `dateofissue` 字段匹配的记录。
在实际业务场景中,常需支持“时间导航”功能:用户每点击一次“上一天”按钮,页面即加载该用户在 N 天前(N 为点击次数)创建的文档列表。原始实现仅固定查询“前一天”,缺乏可扩展性;而优化后的方案通过引入动态日期偏移参数,实现了灵活、可复用的时间维度数据拉取。
将原单路径 /getDocsPrevDay/{uztId} 改为带偏移量的 RESTful 路径,明确语义并提升可测试性:
@RequestMapping(value = "/getPrevDay/{uztId}/{daysOffset}", method = RequestMethod.GET)@ResponseBody@ResponseStatus(HttpStatus.OK)@ApiOperation(value = "获取指定偏移天数的文档(如 daysOffset = -1 表示前一天,-2 表示前两天)")@ApiResponses({ @ApiResponse(code = 200, message = "Success", response = ResponseApi.class)})public List<Documents> getPrevDay( @PathVariable("uztId") Integer uztId, @PathVariable Integer daysOffset) { return documentsDao.getPrevDay(uztId, daysOffset);}
⚠️ 注意:daysOffset 应为负整数(如 -1, -2, -3),表示相对于当前日期向前推的天数。前端点击“上一天”时,应递减该值(初始为 -1)。
避免字符串拼接日期、时区歧义及 current_date() 函数跨数据库兼容性问题,改用 Java 8+ LocalDate + ZoneId 构建标准 Date 对象:
public List<Documents> getPrevDay(Integer uztId, Integer daysOffset) { // 使用系统默认时区确保与业务日期逻辑一致 ZoneId zone = ZoneId.systemDefault(); LocalDate targetDate = LocalDate.now().plusDays(daysOffset); // 如 daysOffset = -2 → 前两天 Date dateParam = Date.from(targetDate.atStartOfDay(zone).toInstant()); return getCurrentSession() .createQuery("FROM Documents WHERE uztId = :uztId AND dateOfIssue = :dateOfIssue ORDER BY dateOfIssue DESC", Documents.class) .setParameter("uztId", uztId) .setParameter("dateOfIssue", dateParam) // 精确匹配 dateOfIssue 字段(类型应为 java.util.Date 或 @Temporal) .getResultList();}
✅ 关键改进点:
通过此方案,你不仅解决了“逐次回溯日期”的核心需求,更构建了健壮、可维护、符合现代 Java 时间 API 规范的数据查询链路。