欢迎光临护送网
详情描述

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年医保异地就医备案政策相比往年有哪些重要的调整?
针对不满一岁的婴儿发生呛噎正确的急救手法是什么
针对不满一岁的婴儿发生呛噎正确的急救手法是什么
如何为家中长期跨省居住的老人办理异地就医备案手续?
如何为家中长期跨省居住的老人办理异地就医备案手续?
公积金贷款评估费可以退吗?贷款失败费用处理
公积金贷款评估费可以退吗?贷款失败费用处理
在电梯故障时,保持冷静并等待救援为何比盲目自救更为重要和安全?
在电梯故障时,保持冷静并等待救援为何比盲目自救更为重要和安全?
阿克苏救护车出租公司-租救护车护送病人转院
阿克苏救护车出租公司-租救护车护送病人转院
克拉玛依市长途救护车出租-医疗转运车租赁
克拉玛依市长途救护车出租-医疗转运车租赁
马鞍山市企业获客软件@网站定制,专业开发团队
马鞍山市企业获客软件@网站定制,专业开发团队
哈密市私人救护车跨省转运-专业接送病人服务车
哈密市私人救护车跨省转运-专业接送病人服务车
丽江市苹果app开发@网站建设推广公司,收费标准
丽江市苹果app开发@网站建设推广公司,收费标准
消费贷逾期后房屋拍卖所得先还利息还是本金?清偿顺序法定规则解析
消费贷逾期后房屋拍卖所得先还利息还是本金?清偿顺序法定规则解析
乌鲁木齐市长途救护车出租就近派车-长途医疗转运车出租,按公里收费
乌鲁木齐市长途救护车出租就近派车-长途医疗转运车出租,按公里收费
西宁市行业网站建设#网站开发制作,提供一站式建站服务
西宁市行业网站建设#网站开发制作,提供一站式建站服务
二手车抵押贷款办理流程,车辆过户与抵押能否同时进行?
二手车抵押贷款办理流程,车辆过户与抵押能否同时进行?
购买海外商品时,电商平台标注的“包税”服务是否真的可靠?
购买海外商品时,电商平台标注的“包税”服务是否真的可靠?
阿拉善盟接送病人出院长途救护车出租-长途急救车出租,按公里收费
阿拉善盟接送病人出院长途救护车出租-长途急救车出租,按公里收费
吐鲁番市120救护车转运-医师护送,设备齐全
吐鲁番市120救护车转运-医师护送,设备齐全
滁州市装修网站建设@专业网站开发设计,提供一站式建站服务
滁州市装修网站建设@专业网站开发设计,提供一站式建站服务