如何使用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表:
我们可以按照性别分组,统计每个性别的人数和年龄总和,同时筛选出人数大于10的性别分组,即:
SELECT COUNT(*) AS count, SUM(age) AS totalAge FROM user GROUP BY gender HAVING count(*) > 1;
查询出来的结果应该是:
我们可以使用下面的代码来模拟这个查询过程:
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表示该性别分组的人数。