超爱学习网
mybatisPlus
一级目录
基础使用
常用注解
构造器类型
条件类型
curd接口
插件扩展
面试题
参考手册
版本
二级目录
等于条件
等于------------eq
不等于----------ne
比较条件
大于------------gt
大于等于--------ge
小于------------lt
小于等于--------le
模糊查询条件
模糊------------like
模糊----------notLike
模糊----------likeLeft
模糊----------likeRight
IN条件
内含--------------in
内含-----------notIn
NULL条件
空------------isNull
空---------isNotNull
自定义条件
自定义---------apply
EXIST条件
存在-----------exists
存在---------notExists
分组排序条件
排序---------orderBy
分组---------groupBy
范围条件
范围--------between
范围----notBetween
范围betweenColumn
范围notBetweenColumn

「 groupBy 」 条件类型概念与作用:

在 MyBatis-Plus 中,'groupBy' 是一种条件类型,用于对查询结果进行分组。它对应于 SQL 中的 'GROUP BY' 操作符。使用 'groupBy' 可以根据一个或多个字段对结果集进行分组,这通常与聚合函数(如 COUNT, SUM, AVG)结合使用,以对每个分组进行聚合运算。这在处理需要按类别统计或汇总数据的场景时非常有用。

示例1:基本的 GROUP BY 使用

// 按状态分组统计用户数量
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('status', 'count(*) as user_count').groupBy('status');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper); // 执行查询

示例2:多字段分组

// 按状态和类型分组统计用户数量
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('status', 'type', 'count(*) as user_count').groupBy('status', 'type');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例3:结合聚合函数

// 按状态分组,计算每组的平均年龄
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('status', 'avg(age) as avg_age').groupBy('status');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例4:结合条件筛选和分组

// 筛选激活状态的用户,并按类型分组统计
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq('status', 'active').groupBy('type');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例5:动态分组

// 根据动态条件进行分组
String groupByField = 'status'; // 可以是外部传入的参数
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.groupBy(groupByField);
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例6:结合子查询和分组

// 结合子查询进行分组统计
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql('id', 'select user_id from user_role where role_id = 1').groupBy('status');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例7:结合 HAVING 子句

// 按状态分组,并筛选平均年龄大于 30 的组
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('status', 'avg(age) as avg_age').groupBy('status').having('avg_age > {0}', 30);
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例8:结合 ORDER BY 和 GROUP BY

// 按类型分组统计,并按统计数量降序排序
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('type', 'count(*) as user_count').groupBy('type').orderByDesc('user_count');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例9:分组后选择特定字段

// 按类型分组,仅选择类型和用户数量
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('type', 'count(*) as user_count').groupBy('type');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);

示例10:分组结合多表查询

// 结合多表查询进行分组统计
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select('user.type', 'count(order.id) as order_count').leftJoin('order', 'user.id = order.user_id').groupBy('user.type');
List<Map<String, Object>> results = userMapper.selectMaps(queryWrapper);