Mybatis-Plus提供了QueryWrapper类和LambdaQueryWrapper类来构建SQL语句,通过这两个类可以实现聚合函数查询。以下是一段用QueryWrapper和Java代码实现的示例:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("count(*) as count","sum(age) as totalAge")  // 指定查询的列
       .groupBy("gender")  // 分组字段
       .having("count(*)>10");  // 添加having筛选条件
List<Map<String,Object>> list = userMapper.selectMaps(wrapper);

在这个例子中,我们通过QueryWrapper指定查询的列、分组字段和having筛选条件,然后调用selectMaps方法查询并返回结果集。在结果集中,每一组数据都对应一个Map对象,Map中的key是列名(如count、totalAge),value是该列对应的值。如果要获取某个聚合函数的结果,只需要从Map中根据列名获取对应的值即可。

需要注意的是,查询聚合函数结果时,被查询的字段必须进行聚合(如count、sum、avg等),否则查询结果会报错。

下面是模拟出来的数据库数据进行聚合查询

好的,假设我们有下面这个user表:

idnamegenderage
1张三20
2李四30
3王五40
4赵六50
5钱七60
6孙八70
7周九80
8吴十90
9郑十一100

我们可以按照性别分组,统计每个性别的人数和年龄总和,同时筛选出人数大于10的性别分组,即:

SELECT COUNT(*) AS count, SUM(age) AS totalAge 
FROM user 
GROUP BY gender 
HAVING count(*) > 1;

查询出来的结果应该是:

counttotalAge
4200
5250

我们可以使用下面的代码来模拟这个查询过程:

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.select("COUNT(*) AS count", "SUM(age) AS totalAge")  // 指定查询的列
       .groupBy("gender")  // 分组字段
       .having("COUNT(*)>1");  // 添加having筛选条件
List<Map<String,Object>> list = userMapper.selectMaps(wrapper);

System.out.println(list);

输出结果应该是:

[{totalAge=200, count=4}, {totalAge=250, count=5}]

其中每个Map表示一个性别分组的统计结果,totalAge表示该性别分组的年龄总和,count表示该性别分组的人数。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐