mybatis plus 用distinct查询
时间: 2025-05-07 11:17:09 浏览: 19
### MyBatis Plus 使用 `distinct` 关键字进行去重查询
在使用 MyBatis Plus 进行数据库操作时,可以通过多种方式实现带有 `DISTINCT` 的查询语句。为了确保返回的结果集中不包含重复项,可以利用 `QueryWrapper` 或者更推荐使用的 `LambdaQueryWrapper` 来构建 SQL 查询条件。
#### 方法一:通过 QueryWrapper 实现
当需要执行简单的去重查询时,可以直接调用 `select()` 方法并传入字段列表,在其中指定 `true` 参数来开启 `DISTINCT` 功能:
```java
// 创建实体类对应的 Wrapper 对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("DISTINCT name", "age"); // 只获取唯一的名字和年龄组合
List<Map<String, Object>> resultMaps = userMapper.selectMaps(queryWrapper);
for (Map<String, Object> map : resultMaps) {
System.out.println(map.get("name") + ", " + map.get("age"));
}
```
这种方法适用于只需要部分列作为结果集的情况,并且希望这些选定的列之间不存在完全相同的记录[^1]。
#### 方法二:借助 LambdaQueryWrapper 提升安全性
对于更加复杂的业务逻辑或是为了避免硬编码字符串带来的风险,建议采用基于 lambda 表达式的 API —— `LambdaQueryWrapper`。这种方式不仅能够提高代码可读性和维护性,还能有效防止潜在的风险如 SQL 注入等问题:
```java
// 定义一个泛型为 User 类型的 LambdaQueryWrapper
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getName, User::getAge).distinct(); // 启用 DISTINCT 并选择要投影的属性
List<User> resultList = userMapper.selectList(wrapper); // 执行查询并将结果映射到 List<User>
resultList.forEach(user -> System.out.println(user.getName() + ", " + user.getAge()));
```
上述例子展示了如何利用 `LambdaQueryWrapper` 和其内置方法 `.distinct()` 来轻松完成带 `DISTINCT` 子句的数据检索工作。
#### 注意事项
- 如果只对单个字段应用 `DISTINCT`,则只需将其名称传递给 `select()` 函数即可;如果涉及多个字段,则应按照实际需求依次列出所有目标字段名。
- 当使用 `LambdaQueryWrapper` 时,默认情况下会自动处理表别名等相关细节,因此开发者无需担心跨表关联或其他复杂场景下的兼容性问题。
阅读全文
相关推荐


















