发布于2026-06-19 阅读(0)
扫一扫,手机访问
在实际业务中,用户点击“上一天”按钮时,页面需要加载N天前的文档数据。这个需求乍看简单,但若实现方式过于死板,后期扩展起来就会很头疼。下面分享一个可复用的方案,通过REST接口传递日期偏移量,结合JPA/Hibernate来高效查询。

原始的方案只支持查询前一天,稍微改个天数就得动代码。优化后的做法是让前端传一个偏移量进来,接口走动态日期计算,既灵活又方便扩展。
先看接口层。直接说个比较实在的做法:把原来的单一路径改成带偏移量的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 getPrevDay(
@PathVariable("uztId") Integer uztId,
@PathVariable Integer daysOffset) {
return documentsDao.getPrevDay(uztId, daysOffset);
}
⚠️ 这里有个小提醒:daysOffset应为负整数(比如-1、-2、-3),表示往前推的天数。前端点一次“上一天”,这个值就减1。
盘完接口,再看DAO层。过去常见的做法是拼接日期字符串或者用current_date()函数,但这些方式在跨数据库或者时区切换时容易出问题。改用Ja va 8+的LocalDate,配合ZoneId,干净又安全。
public ListgetPrevDay(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) .getResultList(); }
这里有几个关键的改进点值得关注:
最后,几个容易踩的细节值得留意:
有了这套方案,逐次回溯日期的需求不仅解决了,还能顺便搭出一条贴近现代Ja va时间API规范的查询链路,健壮又好维护。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8