mybatisplus去重分页动态条件查询sql
时间: 2025-06-05 13:33:43 浏览: 7
### MyBatis-Plus 实现去重分页并支持动态条件查询的 SQL 解决方案
MyBatis-Plus 是一款强大的持久层框架,它提供了便捷的方式实现分页、去重以及动态条件查询的功能。以下是针对该需求的具体解决方案。
#### 1. **核心概念**
在 MyBatis-Plus 中,`Page<T>` 类用于封装分页结果,而 `LambdaQueryWrapper<T>` 则负责构建动态查询条件。为了实现去重效果,可以在 SQL 查询中加入 `DISTINCT` 关键字[^1]。
---
#### 2. **代码示例**
##### (1) **实体类定义**
假设我们有一个名为 `User` 的实体类,表示用户的表结构如下:
```java
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
```
##### (2) **Mapper 接口定义**
创建一个继承自 `BaseMapper<User>` 的接口:
```java
public interface UserMapper extends BaseMapper<User> {}
```
##### (3) **服务层实现**
以下是一个完整的实现示例,展示如何去重、分页并支持动态条件查询:
```java
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public Page<User> queryDistinctPages(int currentPage, int pageSize, String name, Integer minAge) {
// 初始化分页对象
Page<User> page = new Page<>(currentPage, pageSize);
// 创建 LambdaQueryWrapper 对象,并设置动态查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
// 开启 DISTINCT 去重
wrapper.distinct(true);
// 动态添加查询条件
if (name != null && !name.isEmpty()) {
wrapper.like(User::getName, name); // 模糊匹配用户名
}
if (minAge != null) {
wrapper.ge(User::getAge, minAge); // 大于等于指定年龄
}
// 执行分页查询
return userMapper.selectPage(page, wrapper);
}
```
---
#### 3. **SQL 日志分析**
以上代码最终生成的 SQL 将类似于以下形式(假设有模糊查询和最小年龄条件):
```sql
SELECT DISTINCT
id, name, age, email
FROM
user
WHERE
name LIKE '%张三%' AND age >= 18
LIMIT 0, 10;
```
可以看到,`DISTINCT` 关键字被成功应用到查询中,同时动态条件也已生效[^2]。
---
#### 4. **注意事项**
- 如果需要对多个字段进行去重,可以显式指定这些字段,例如:
```java
wrapper.select(User::getId, User::getName).distinct();
```
- 当前实现依赖于 MyBatis-Plus 的内置分页插件。如果项目未配置分页插件,请先完成相关初始化工作[^3]。
- 若业务逻辑较为复杂,可考虑使用自定义 SQL 方案替代默认生成器。
---
###
阅读全文
相关推荐

















