You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data查询:如何获取30天内带分页的记录?

解决Spring Data JPA获取30天内记录的问题

我来帮你搞定这个需求!你已经有了基础的分页查询代码,只需要调整日期条件的处理方式就行,下面给你两种常用的实现方案:

方案一:业务层计算30天前的日期(推荐,跨数据库兼容)

这种方式把日期计算逻辑放在业务服务层,仓库层只负责接收参数执行查询,职责更清晰,而且适配所有数据库。

步骤1:保留现有仓库方法

你的仓库代码无需修改,保持原样即可:

@Query(value = "SELECT rp FROM RequestPipeline rp JOIN FETCH rp.requestAudits where rp.createdAt >= :date", 
       countQuery="SELECT count(*) FROM RequestPipeline rp JOIN rp.requestAudits where rp.createdAt >= :date")
Page<RequestPipeline> findAllRequests(Pageable pageable, @Param("date") Timestamp date);

步骤2:在服务层调用时计算时间参数

在调用仓库方法前,用Java 8+的日期API计算出30天前的时间,转成Timestamp传入(建议指定时区避免差异):

// 示例服务层代码
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;

// 用UTC时区计算,避免服务器本地时区变化影响结果
LocalDateTime thirtyDaysAgo = LocalDateTime.now(ZoneId.of("UTC")).minusDays(30);
Timestamp dateParam = Timestamp.valueOf(thirtyDaysAgo);

// 调用仓库方法获取结果
Page<RequestPipeline> recentRequests = requestPipelineRepository.findAllRequests(pageable, dateParam);

方案二:直接在JPQL中计算日期(适合简单场景)

如果不想在业务层处理日期,可以直接在JPQL语句里写死30天的条件,省去传参步骤。不过要注意不同数据库的日期函数语法有差异:

针对PostgreSQL/H2数据库的写法

@Query(value = "SELECT rp FROM RequestPipeline rp JOIN FETCH rp.requestAudits where rp.createdAt >= CURRENT_TIMESTAMP - INTERVAL '30 days'", 
       countQuery="SELECT count(*) FROM RequestPipeline rp JOIN rp.requestAudits where rp.createdAt >= CURRENT_TIMESTAMP - INTERVAL '30 days'")
Page<RequestPipeline> findAllRequestsInLast30Days(Pageable pageable);

针对MySQL数据库的写法

@Query(value = "SELECT rp FROM RequestPipeline rp JOIN FETCH rp.requestAudits where rp.createdAt >= DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)", 
       countQuery="SELECT count(*) FROM RequestPipeline rp JOIN rp.requestAudits where rp.createdAt >= DATE_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)")
Page<RequestPipeline> findAllRequestsInLast30Days(Pageable pageable);

重要注意事项

  • 确保rp.createdAt字段的类型和数据库中的字段类型匹配(比如TIMESTAMP或DATETIME),否则日期比较会出错。
  • 无论用哪种方案,countQuery的WHERE条件必须和主查询完全一致,否则分页的总页数、总条数会不准确。
  • 处理日期时尽量指定时区(比如UTC),避免服务器本地时区变化导致查询结果不符合预期。

内容的提问来源于stack exchange,提问作者Ban

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:10:36