如何实现点击按钮逐步获取数据库中前N天的文档数据
解决方案
核心问题分析
你当前的代码存在两个关键问题:一是DAO里计算了前一天日期但并未用于查询逻辑,依然在查当日数据;二是没有区分点击次数,每次请求都固定只减一天,无法实现逐天递进回溯的需求。要解决这个问题,需要前端传递「回溯天数」参数,后端根据该参数计算目标日期后执行查询。
步骤1:修改Controller,接收回溯天数参数
给接口新增daysBack参数,用来标识需要回溯的天数(比如第一次点击传1,第二次传2):
@RequestMapping(value = "/getDocsPrevDay/{uztId}", method = RequestMethod.GET) @ResponseBody @ResponseStatus(HttpStatus.OK) @ApiOperation(value = "Get documents by backtracking days") @ApiResponses({ @ApiResponse(code = 200, message = "Success", response = ResponseApi.class) }) public List<Documents> getPrevDay(@PathVariable("uztId") Integer uztId, @RequestParam("daysBack") Integer daysBack) { // 简单参数校验,避免非法值 if (daysBack < 1) { throw new IllegalArgumentException("daysBack must be at least 1"); } return documentsDao.getPrevDay(uztId, daysBack); }
步骤2:重构DAO,用Java 8日期API实现日期计算
放弃线程不安全的Date和SimpleDateFormat,改用LocalDate处理日期,同时修正查询逻辑:
private static final String DATE_FORMAT = "dd.MM.yyyy"; public List<Documents> getPrevDay(Integer uztId, Integer daysBack) { // 计算目标回溯日期:当前日期减去指定天数 LocalDate targetDate = LocalDate.now().minusDays(daysBack); // 日志格式化输出(可选) DateTimeFormatter formatter = DateTimeFormatter.ofPattern(DATE_FORMAT); System.out.println("Target date: " + targetDate.format(formatter)); // 执行HQL查询,匹配目标日期的文档 List<Documents> documents = getCurrentSession() .createQuery("from Documents where uztId = :uztId and dateOfIssue = :targetDate", Documents.class) .setParameter("uztId", uztId) .setParameter("targetDate", targetDate) .getResultList(); return documents; }
步骤3:前端配合传递参数
在前端维护一个计数器,初始值为0,每次点击「上一天」按钮时计数器加1,将计数器的值作为daysBack参数传递给后端:
- 第一次点击:传递
daysBack=1→ 获取前1天的文档 - 第二次点击:传递
daysBack=2→ 获取前2天的文档 - 以此类推
额外注意事项
- 如果你的
dateOfIssue字段是数据库DATE类型,Hibernate会自动完成LocalDate与数据库日期类型的转换 - 若使用旧版Hibernate不支持
LocalDate,可将targetDate转为java.sql.Date后传入:java.sql.Date.valueOf(targetDate) - 建议在后端补充更多参数校验逻辑,避免非法请求
内容的提问来源于stack exchange,提问作者treumiton
相关产品推荐
相关产品推荐

