如何使用mybatisplus的query wrapper实现聚合函数查询
在这个例子中,我们通过QueryWrapper指定查询的列、分组字段和having筛选条件,然后调用selectMaps方法查询并返回结果集。在结果集中,每一组数据都对应一个Map对象,Map中的key是列名(如count、totalAge),value是该列对应的值。其中每个Map表示一个性别分组的统计结果,totalAge表示该性别分组的年龄总和,count表示该性别分组的人数。需要注意的是,
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表示该性别分组的人数。
更多推荐
所有评论(0)