如何使用mybatisplus的query wrapper实现聚合函数查询

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表:

id name gender age 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;

查询出来的结果应该是:

count totalAge 4 200 5 250

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

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表示该性别分组的人数。

经验分享 程序员 微信小程序 职场和发展