MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
一、序言
众所周知,MybatisPlus在处理单表DAO操作时非常的方便。在处理多表连接连接查询也有优雅的解决方案。今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询。
由于视频的交互性更强,保留更多的细节,看视频的朋友,传送门在这里。
下面的内容是博客文字版。
二、代码实现
1、用户实体类
@TableName(value = "tb_user")
public class User {
    private static final long serialVersionUID = 1L;
    private Integer age;
    private Long deptId;
    @TableId(type = IdType.AUTO)
    private Long userId;
    private String userName;
    public User(User user) {
        if (Objects.nonNull(user)) {
            this.age = user.age;
            this.deptId = user.deptId;
            this.userId = user.userId;
            this.userName = user.userName;
        }
    }
}
2、用户聚合类
本类属于核心代码
@TableName(value = "tb_user")
public class UserAggr {
    private Long deptId;
    /**
     * 新增的一列数据 用于存储count字段
     * 注解非常关键
     */
    @TableField(value = "count(*)", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
    private Long count;
    public UserAggr(UserAggr user) {
        if (Objects.nonNull(user)) {
            this.deptId = user.deptId;
            this.count = user.count;
        }
    }
}
3、用户聚合类VO
本类属于核心代码
public class UserAggrVo extends UserAggr {
    private String deptName;
    /**
     * 很重要构造器
     *
     * @param user
     */
    public UserAggrVo(UserAggr user) {
        super(user);
    }
}
4、服务层调用
服务层完成调用
public List<UserAggrVo> selectList3() {
    LambdaQueryWrapper<UserAggr> wrapper = Wrappers.lambdaQuery(UserAggr.class)
            .select(UserAggr::getDeptId, UserAggr::getCount)
            .groupBy(UserAggr::getDeptId);
    List<UserAggr> userAggrList = userAggrMapper.selectList(wrapper);
    List<UserAggrVo> userAggrVoList = EntityUtils.toList(userAggrList, UserAggrVo::new);
    // 给deptName完成属性赋值
    Set<Long> deptIds = EntityUtils.toSet(userAggrVoList, UserAggrVo::getDeptId);
    if (deptIds.size() > 0) {
        List<Dept> deptList = deptMapper.selectList(Wrappers.lambdaQuery(Dept.class)
                                                    .in(Dept::getDeptId, deptIds));
        Map<Long, String> map = EntityUtils.toMap(deptList, Dept::getDeptId, Dept::getDeptName);
        for (UserAggrVo userAggrVo : userAggrVoList) {
            userAggrVo.setDeptName(map.get(userAggrVo.getDeptId()));
        }
    }
    return userAggrVoList;
}
5、效果展示
{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "deptId": "10",
      "count": "1",
      "deptName": "Java"
    },
    {
      "deptId": "11",
      "count": "2",
      "deptName": "Mysql"
    },
    {
      "deptId": "12",
      "count": "3",
      "deptName": "Tomcat"
    }
  ]
}
三、总结
本方案很好的实现了MybatisPlus基于Lambda表达式实现聚合操作,代码在形式上与单表保持统一,代码优雅。各位看官朋友点赞支持一波。
MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy的更多相关文章
- Django聚合与分组查询中value与annotate的顺序问题
		在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论: 结论 value在annotate前面时 ... 
- Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析
		Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析 一:Linq的聚合运算 1. 常见的聚合运算:Aggregate,Count, Sum, Distinct,Max, ... 
- Lambda表达式与标准运算符查询
		class Program { static void Main(string[] args) { //Lambda表达式输出List集合每一项 List<string> list = n ... 
- python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
		昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ... 
- (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
		昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ... 
- Django基础(5)  ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询
		一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ... 
- Solr.NET快速入门(五)【聚合统计,分组查询】
		聚合统计 属性 说明 Min 最小值 Max 最大值 Sum 总和 Count 记录数,也就是多少行记录 Missing 结果集中,有多少条记录是空值 SumOfSquares 平方和(x1^2 + ... 
- Django-ORM之聚合和分组查询、F和Q查询、事务
		聚合查询 聚合对查询的结果进行一步的计算加工. aggregate()是QuerySet 的一个终止子句 ,他的作用是,返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键 ... 
- Django 多表、跨表、聚合、分组查询
		前期准备: 创建表 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalFi ... 
随机推荐
- 【MySQL】从入门到掌握4-主键与Unique
			上期:[MySQL]从入门到掌握3-WorkBench 第一章:主键 在实际开发中,我们不会使用用户名字当作主键. 因为当我们用数据库记录学生信息的时候,学生有可能重名! 我们一般会使用是个int ... 
- docker学习笔记-容器相关命令
			新建并启动容器 docker pull centos (先下载镜像,如果没有直接使用docker run 命令会根据本地情况进行下载) # docker run [可选参数] image # 参数说明 ... 
- 学习完nio的一个小笔记吧
			这是一个nio网络通信服务端的demo,主要就学习了selector的一些用法,以及它里面的事件类型 selector是对nio的一个优化,它能保证既能高效处理线程中的事件,又能保证线程不会一直占用c ... 
- flutter系列之:Material中的3D组件Card
			目录 简介 Card详解 Card的使用 总结 简介 除了通用的组件之外,flutter还提供了两种风格的特殊组件,其中在Material风格中,有一个Card组件,可以很方便的绘制出卡片风格的界面, ... 
- 使用 Loki 收集 Traefik 日志
			转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247492264&idx=1&sn=f443c92664 ... 
- 在 Kubernetes 上运行高可用的 Kafka 集群
			转载自:https://www.qikqiak.com/post/deploy-kafka-ha-on-k8s/ Apache Kafka 是目前最流行的分布式消息发布订阅系统,虽然 Kafka 非常 ... 
- Logstash: 启动监控及集中管理
			在本篇文章里,我将详细介绍如果启动Logstash的监控及集中管理. 前提条件 安装好Logstash,设置Elasticsearch及Kibana的安全密码. 如何监控Logstash? 我们安装如 ... 
- 使用KVM安装windows10系统出现内存直接占满的情况解决
			情况说明: 在使用kvm安装windows10系统的时候,采用的win10系统不是原版系统,而是经过进一步封装的系统,使用大白菜PE先格式化磁盘,然后再安装的系统,在系统安装好重启的时候,卡在安装界面 ... 
- 第一章:模型层 - 5:模型的元数据Meta
			模型的元数据,指的是"除了字段外的所有内容",例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的.但是,我要说但是,有 ... 
- prometheus和granfana企业级监控实战v5
			文件地址:https://files.cnblogs.com/files/sanduzxcvbnm/prometheus和granfana企业级监控实战v5.pdf 
