LambdaQueryWrapper group by 获取最新记录
时间: 2025-06-30 17:00:15 浏览: 13
### 使用 LambdaQueryWrapper 进行分组查询以获取最新记录
为了使用 `LambdaQueryWrapper` 在 MyBatis-Plus 中执行分组查询并获得每个分组中的最新记录,可以通过组合 SQL 函数和条件来实现这一目标。下面是一个具体的例子说明如何操作。
假设有一个名为 `UserRecord` 的表,其中包含用户的活动日志信息,并希望按用户 ID (`userId`) 分组,找到每组中时间戳(`timestamp`)最大的那条记录作为该用户的最近一次活动记录。
#### 创建实体类
首先定义对应的实体类:
```java
public class UserActivity {
private Long id;
private Integer userId; // 用户ID
private Date timestamp; // 时间戳
}
```
#### 编写 Mapper 接口方法
接着,在相应的 Mapper 文件里声明一个自定义的方法签名用于接收特定类型的返回值列表:
```java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserActivityMapper extends BaseMapper<UserActivity> {}
```
#### 构建查询语句
最后编写服务层逻辑或测试案例里的代码片段完成实际的数据检索工作:
```java
// 导入必要的包
import java.util.List;
import org.junit.jupiter.api.Test;
import static com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper.*;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@Test
void findLatestRecordsPerGroup() {
List<UserActivity> latestActivities = lambdaQuery()
.select(UserActivity::getId, UserActivity::getUserId, UserActivity::getTimestamp)
.groupBy(UserActivity::getUserId)
.having("MAX({0})", UserActivity::getTimestamp)
.list();
// 打印结果集
latestActivities.forEach(System.out::println);
}
```
上述代码通过调用 `lambdaQuery()` 方法创建了一个基于 `LambdaQueryWrapper` 的链式查询构造器实例;选择了所需的字段之后应用了 `GROUP BY` 子句按照 `userId` 字段进行了分组处理;再利用 HAVING 条件筛选出各组内具有最大 `timestamp` 值的那一项[^1]。
需要注意的是,HAVING 后面的部分可能需要根据具体数据库方言调整语法结构,这里仅提供了一种常见的表达方式。对于某些复杂的场景下,建议查阅官方文档了解更详细的指导和支持的信息[^2]。
阅读全文
相关推荐











