一、序言

众所周知,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的更多相关文章

  1. Django聚合与分组查询中value与annotate的顺序问题

    在学习Django聚合与分组查询中,发现value与annotate的顺序不同时,查询结果大相径庭,经过一下午的研究,终于弄明白了,现在分享给大家,先上结论: 结论 value在annotate前面时 ...

  2. Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析

    Linq聚合操作之Aggregate,Count,Sum,Distinct源码分析 一:Linq的聚合运算 1. 常见的聚合运算:Aggregate,Count, Sum, Distinct,Max, ...

  3. Lambda表达式与标准运算符查询

    class Program { static void Main(string[] args) { //Lambda表达式输出List集合每一项 List<string> list = n ...

  4. python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

  5. (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

  6. Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  7. Solr.NET快速入门(五)【聚合统计,分组查询】

    聚合统计 属性 说明 Min 最小值 Max 最大值 Sum 总和 Count 记录数,也就是多少行记录 Missing 结果集中,有多少条记录是空值 SumOfSquares 平方和(x1^2 + ...

  8. Django-ORM之聚合和分组查询、F和Q查询、事务

    聚合查询 聚合对查询的结果进行一步的计算加工. aggregate()是QuerySet 的一个终止子句 ,他的作用是,返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键 ...

  9. Django 多表、跨表、聚合、分组查询

    前期准备: 创建表 class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalFi ...

随机推荐

  1. Python条件语句的用法

    python条件语句使用 if 表达式,难度不高,需要注意的是嵌套用法,以及如何设置对应的条件. if 条件判断语句 python 语句是按固定顺序执行的,先执行前面的语句,再执行后面的语句.如果你像 ...

  2. SpringBoot 整合 MongoDB 实战介绍

    一.介绍 在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库.集合.文档! 数据库(D ...

  3. docker容器数据卷的使用

    什么是容器数据卷 docker的理念回顾 将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的! 就好比,你安装一个MySQL,结果你把容器删了,就相当于 ...

  4. hadoop 文件参数配置

    准备环境(省略) 上传实验所需的压缩包 配置网络信息 修改主机名 配置域名解析 关闭防火墙与SELinux(在所有节点上执行)代码如下: systemctl disable --now firewal ...

  5. 关于MicroPython mpremote工具 的一些用例,闲聊

    关于MicroPython mpremote工具 的一些用例,闲聊 我尝试了很多不同的第三方micropython工具,有些是Windows应用程序,有些是VScode插件. 但是当我尝试过Micro ...

  6. 【设计模式】Java设计模式 - 装饰者模式

    Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...

  7. Web 开发相关概念

    Web 开发相关概念 前端 后端 全栈 前端 Front-end:网站中用户看到的部分 HTML CSS JavaScript 库和框架 设计工具 后端 Back-end:网站中用户看不到的部分 编程 ...

  8. Linkerd、Consul、Istio、Kuma、Traefik、AWS App服务网格全方位对比

  9. 如何从Django项目中删除或隐藏应用

    1.项目的settings.py文件 INSTALLED_APPS中删除或者注释掉,这是针对数据库这一块儿的 2.项目的urls.py文件 删除或这注释掉应用的路径导入 urlpatterns中删除或 ...

  10. Gitlab添加K8S集群

    介绍如何在Gitlab项目中添加K8S集群,以便使用K8S集群部署gitlab-runner帮我们运行gitlab的CI/CD. 参考官方文档:https://docs.gitlab.com/ee/u ...