本文介绍如何在 web 应用中实现“点击一次加载前一天数据,再点加载前两天数据”的交互逻辑,核心是将日期偏移量作为路径参数传递至后端,并结合 java 8 时间 api 精确查询对应日期的文档记录。
本文介绍如何在 web 应用中实现“点击一次加载前一天数据,再点加载前两天数据”的交互逻辑,核心是将日期偏移量作为路径参数传递至后端,并结合 java 8 时间 api 精确查询对应日期的文档记录。
在实际业务开发中,常需支持按时间维度动态翻页查看历史数据(如日报、审计日志等)。本教程以 Spring MVC + Hibernate 为例,详解如何实现「每次点击「Previous」按钮,查询距当前日期 N 天前的文档数据」这一需求。
✅ 关键设计思路
- 前端控制偏移量:每次点击按钮时,递增 daysOffset(如第 1 次传 -1,第 2 次传 -2),避免服务端维护状态;
- 后端精准计算日期:使用 LocalDate.now().plusDays(daysOffset) 计算目标日期(注意:daysOffset 应为负值,如 -1 表示前一天);
- 数据库日期匹配:确保 dateOfIssue 字段类型为 DATE(非 DATETIME),并使用 Date.from(localDate.atStartOfDay().toInstant()) 转换为 java.util.Date,以保证与 Hibernate 查询兼容;
- SQL 查询安全:使用命名参数绑定(setParameter),杜绝 SQL 注入风险。
? 示例代码(优化版)
Controller 层(支持任意偏移天数):
@RequestMapping(value = "/getPrevDay/{uztId}/{daysOffset}", method = RequestMethod.GET)
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@ApiOperation(value = "获取指定偏移天数的文档列表(如 -1=昨日,-2=前日)")
@ApiResponses({
@ApiResponse(code = 200, message = "Success", response = Documents.class, responseContainer = "List")
})
public List<Documents> getPrevDay(
@PathVariable("uztId") Integer uztId,
@PathVariable Integer daysOffset) {
// 注意:前端应传入负数(如 -1, -2, -3...)
return documentsDao.getPrevDay(uztId, daysOffset);
}DAO 层(推荐使用 Java 8 时间 API):
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) // 注意字段名拼写一致性(原问题中 DAO 写为 dataOfIssue,应统一为 dateOfIssue)
.getResultList();
}⚠️ 注意事项与最佳实践
- 字段名校验:确认实体类 Documents 中日期字段名为 dateOfIssue(而非 dataOfIssue),否则 HQL 查询将失败;
- 时区一致性:若数据库存储为 UTC,建议显式指定 ZoneId.of("UTC"),避免本地时区导致日期错位;
- 空结果处理:前端应妥善处理返回空列表的情况(如显示“当日无数据”提示);
- 性能优化:为 uztId 和 dateOfIssue 字段建立联合索引,大幅提升查询效率;
- 日期类型映射:确保 Hibernate 映射中 dateOfIssue 使用 @Temporal(TemporalType.DATE) 或 JPA 2.2+ 的 @Column(columnDefinition = "DATE")。
通过该方案,您可轻松扩展为任意日期偏移查询(如跳转到某具体日期),且完全无状态、高并发友好。

















