欢迎光临护送网
详情描述

select() 方法结合 distinct() 或 SQL 函数来实现。以下是几种常见的去重查询方式:

1. 使用 DISTINCT 关键字

方式一:单字段去重

// 查询所有不重复的 name
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getName)
       .distinct();  // 添加 DISTINCT 关键字
List<User> users = userMapper.selectList(wrapper);

方式二:多字段去重

// 查询 name 和 age 组合不重复的记录
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getName, User::getAge)
       .distinct();
List<User> users = userMapper.selectList(wrapper);

2. 使用 GROUP BY 去重

// 按 name 分组,查询每个不重复的 name
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getName)
       .groupBy(User::getName);
List<User> users = userMapper.selectList(wrapper);

// 获取分组计数
wrapper.select(User::getName, "COUNT(*) as count")
       .groupBy(User::getName);

3. 复杂去重查询

示例一:去重并排序

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getName)
       .distinct()
       .orderByAsc(User::getName);  // 按名称升序排列

List<User> users = userMapper.selectList(wrapper);

示例二:带条件的去重查询

LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getDepartmentId, User::getPosition)
       .distinct()
       .eq(User::getStatus, 1)  // 状态为激活的用户
       .ge(User::getCreateTime, "2023-01-01");  // 2023年以后创建

List<User> users = userMapper.selectList(wrapper);

4. 使用自定义 SELECT 语句去重

// 使用 SQL 函数去重并统计
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.selectSql("DISTINCT department_id, COUNT(*) as user_count")
       .groupBy(User::getDepartmentId);

List<Map<String, Object>> result = userMapper.selectMaps(wrapper);

5. 获取去重后的单个字段值列表

// 获取所有不重复的部门ID列表
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.select(User::getDepartmentId)
       .distinct();

List<Long> departmentIds = userMapper.selectObjs(wrapper)
    .stream()
    .map(obj -> (Long) obj)
    .collect(Collectors.toList());

6. 完整示例

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    /**
     * 查询每个部门的不同职位
     */
    public List<Map<String, Object>> getDistinctPositionsByDepartment() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(User::getDepartmentId, User::getPosition)
               .distinct()
               .isNotNull(User::getDepartmentId)
               .isNotNull(User::getPosition)
               .orderByAsc(User::getDepartmentId, User::getPosition);

        return userMapper.selectMaps(wrapper);
    }

    /**
     * 统计每个不重复姓名的用户数量
     */
    public List<Map<String, Object>> countUsersByDistinctName() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.select("DISTINCT name, COUNT(*) as user_count")
               .groupBy(User::getName)
               .having("COUNT(*) > 1");  // 出现次数大于1的

        return userMapper.selectMaps(wrapper);
    }

    /**
     * 分页查询去重结果
     */
    public Page<User> getDistinctUsersByPage(int page, int size) {
        Page<User> pageParam = new Page<>(page, size);
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(User::getName, User::getEmail)
               .distinct()
               .orderByDesc(User::getCreateTime);

        return userMapper.selectPage(pageParam, wrapper);
    }
}

注意事项

性能考虑:大量数据去重时注意性能,建议在数据库层面优化 索引优化:为去重字段建立索引可以提高查询效率 内存占用:结果集较大时考虑分页查询 MyBatis-Plus版本:确保使用的是支持 LambdaWrapper 的版本(3.0+)

实体类示例

@Data
@TableName("user")
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private Long departmentId;
    private String position;
    private Integer status;
    private LocalDateTime createTime;
}

这些方法涵盖了大多数去重查询场景,可以根据具体需求选择合适的方式。

相关帖子
2026年,数字经济领域从业者可以关注哪些特定的落户优惠政策?
2026年,数字经济领域从业者可以关注哪些特定的落户优惠政策?
2026年医保异地就医备案政策相比往年有哪些重要的调整?
2026年医保异地就医备案政策相比往年有哪些重要的调整?
针对不满一岁的婴儿发生呛噎正确的急救手法是什么
针对不满一岁的婴儿发生呛噎正确的急救手法是什么
如何为家中长期跨省居住的老人办理异地就医备案手续?
如何为家中长期跨省居住的老人办理异地就医备案手续?
女性更年期如何影响心血管健康及2026年预防管理策略?
女性更年期如何影响心血管健康及2026年预防管理策略?
对于残疾人士士自主创业,社会与政府提供了哪些帮扶渠道?
对于残疾人士士自主创业,社会与政府提供了哪些帮扶渠道?
如果对遗产管理人的行为不满意,继承人可以通过什么途径进行监督?
如果对遗产管理人的行为不满意,继承人可以通过什么途径进行监督?
阜新市120救护车出租服务-重症病人转院租救护车,车内设备齐全
阜新市120救护车出租服务-重症病人转院租救护车,车内设备齐全
除了传统行业,2026年有哪些新兴的数字经济领域更适合残疾人发挥独特优势?
除了传统行业,2026年有哪些新兴的数字经济领域更适合残疾人发挥独特优势?
有哪些容易被忽视的生活习惯,实际上正在悄悄消耗储蓄?
有哪些容易被忽视的生活习惯,实际上正在悄悄消耗储蓄?
西安市长途救护车出租设备齐全-24小时救护车接送
西安市长途救护车出租设备齐全-24小时救护车接送
选择不同功率的取暖设备,最终获得的政府补贴金额会有差异吗?
选择不同功率的取暖设备,最终获得的政府补贴金额会有差异吗?
畅想十年后,脑机接口会不会成为一种新型的社交工具,并改变人际交流的形态?
畅想十年后,脑机接口会不会成为一种新型的社交工具,并改变人际交流的形态?
短租房源的布草洗涤与深度清洁,有哪些可验证的卫生流程与标准?
短租房源的布草洗涤与深度清洁,有哪些可验证的卫生流程与标准?
对于丁克家庭或者未育夫妻,一方为家庭付出较多能获得补偿吗?
对于丁克家庭或者未育夫妻,一方为家庭付出较多能获得补偿吗?
喀什智能响应式网站建设@专业网站建设服务,价格透明
喀什智能响应式网站建设@专业网站建设服务,价格透明
2026年保障性租赁住房的智能家居与数字化管理会普及哪些便利功能?
2026年保障性租赁住房的智能家居与数字化管理会普及哪些便利功能?
南宁市AI数字人视频制作#网站开发设计服务,企业解决方案
南宁市AI数字人视频制作#网站开发设计服务,企业解决方案
瓦房店市120救护车长途转运-救护车出租公司哪家好
瓦房店市120救护车长途转运-救护车出租公司哪家好
六安市高效获客助手@企业网站定制开发,一站式建站服务
六安市高效获客助手@企业网站定制开发,一站式建站服务