欢迎光临中国护送网
详情描述

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年预防管理策略?
诸暨市网站定制-购物网站设计开发,专业建站
诸暨市网站定制-购物网站设计开发,专业建站
诸暨市私人救护车长途转运-租救护车护送病人出院回家
诸暨市私人救护车长途转运-租救护车护送病人出院回家
红河精准获客系统@企业网站建设,模板建站
红河精准获客系统@企业网站建设,模板建站
太原市120救护车长途运送病人-24小时救护车接送病人
太原市120救护车长途运送病人-24小时救护车接送病人
南昌市120救护车出租跨省转运-全国都有车,就近发车
南昌市120救护车出租跨省转运-全国都有车,就近发车
新国标对电动自行车的车速与重量限制,在实际出行中是否真的够用?
新国标对电动自行车的车速与重量限制,在实际出行中是否真的够用?
宜昌市精准获客软件#网站优化推广公司,收费透明
宜昌市精准获客软件#网站优化推广公司,收费透明
在2026年,即时通讯软件在支持听障、语障人士沟通方面有哪些实用的功能?
在2026年,即时通讯软件在支持听障、语障人士沟通方面有哪些实用的功能?
如何通过主动搜索和探索来平衡算法的被动推荐内容?
如何通过主动搜索和探索来平衡算法的被动推荐内容?
如果中奖后发现发票信息有误,应如何联系官方进行更正与确认?
如果中奖后发现发票信息有误,应如何联系官方进行更正与确认?
大庆市电商网站建设@独立网站制作,定制开发
大庆市电商网站建设@独立网站制作,定制开发
有没有既省力又安全的洗衣机清洗羽绒服的具体操作步骤?
有没有既省力又安全的洗衣机清洗羽绒服的具体操作步骤?
滨州市救护车出租收费标准-长途医疗转运车出租,按公里收费
滨州市救护车出租收费标准-长途医疗转运车出租,按公里收费
老房子翻新,在不改动承重结构的前提下如何优化空间布局更合理?
老房子翻新,在不改动承重结构的前提下如何优化空间布局更合理?
2026年企业残保金的详细计算方式是什么,主要依据哪些因素来确定?
2026年企业残保金的详细计算方式是什么,主要依据哪些因素来确定?
内膜厚度4mm正常吗
内膜厚度4mm正常吗
购买预售商品房,购房款是否进入监管账户对购房者来说有何重要性?
购买预售商品房,购房款是否进入监管账户对购房者来说有何重要性?