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

如何使用Spring Boot JPA实现按分组取最新记录且不使用原生查询

Spring Data JPA 无原生SQL实现分组取最新记录方案

适用场景

基于Spring Boot 2.5.0版本,无需原生SQL,保留数据库跨平台兼容性,从事务表中获取每个分组下的最新一条记录。

前置实体定义

假设事务表对应实体为Transaction,核心字段如下:

@Entity
@Table(name = "t_transaction")
public class Transaction {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    // 分组维度字段,可根据业务替换为其他分组字段
    private Long groupId;
    // 记录生成时间,用于判断记录新旧
    private LocalDateTime createTime;
    // 其余业务字段、getter/setter 省略
}

实现方案(标准JPQL语法)

直接在JPA Repository接口中定义查询方法,使用标准JPQL编写查询逻辑,底层会自动适配不同数据库生成对应SQL,完全不依赖数据库特定语法:

public interface TransactionRepository extends JpaRepository<Transaction, Long> {

    /**
     * 查询每个分组下的最新记录
     * 逻辑:子查询查询每个分组的最大创建时间,外层查询匹配对应分组和最大时间的记录
     */
    @Query("SELECT t FROM Transaction t " +
            "WHERE t.createTime = (SELECT MAX(t2.createTime) FROM Transaction t2 WHERE t2.groupId = t.groupId)")
    List<Transaction> findLatestRecordPerGroup();
}

优化点(避免同分组同时间多条记录的问题)

如果业务存在同一个分组同一时间插入多条记录的场景,可以改用最大ID作为判断最新记录的依据,ID自增的场景下最大ID天然对应最新记录:

@Query("SELECT t FROM Transaction t " +
        "WHERE t.id = (SELECT MAX(t2.id) FROM Transaction t2 WHERE t2.groupId = t.groupId)")
List<Transaction> findLatestRecordPerGroup();

方案优势

  • 完全基于JPA规范实现,无任何数据库特定语法,适配MySQL、PostgreSQL、Oracle等所有主流关系型数据库
  • 兼容Spring Boot 2.5.0对应的Spring Data JPA版本,无需引入额外依赖
  • 执行效率与原生SQL实现的分组取最新逻辑基本持平,无额外性能损耗

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 17:45:03