MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX Group ...

打印 上一主题 下一主题

主题 912|帖子 912|积分 2736

一、序言

众所周知,MybatisPlus在处理单表DAO操作时非常的方便。在处理多表连接连接查询也有优雅的解决方案。今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询。
由于视频的交互性更强,保留更多的细节,看视频的朋友,传送门在这里。
下面的内容是博客文字版。
二、代码实现

1、用户实体类
  1. @TableName(value = "tb_user")
  2. public class User {
  3.     private static final long serialVersionUID = 1L;
  4.     private Integer age;
  5.     private Long deptId;
  6.     @TableId(type = IdType.AUTO)
  7.     private Long userId;
  8.     private String userName;
  9.    
  10.     public User(User user) {
  11.         if (Objects.nonNull(user)) {
  12.             this.age = user.age;
  13.             this.deptId = user.deptId;
  14.             this.userId = user.userId;
  15.             this.userName = user.userName;
  16.         }
  17.     }
  18. }
复制代码
2、用户聚合类

本类属于核心代码
  1. @TableName(value = "tb_user")
  2. public class UserAggr {
  3.    
  4.     private Long deptId;
  5.     /**
  6.      * 新增的一列数据 用于存储count字段
  7.      * 注解非常关键
  8.      */
  9.     @TableField(value = "count(*)", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
  10.     private Long count;
  11.    
  12.     public UserAggr(UserAggr user) {
  13.         if (Objects.nonNull(user)) {
  14.             this.deptId = user.deptId;
  15.             this.count = user.count;
  16.         }
  17.     }
  18. }
复制代码
3、用户聚合类VO

本类属于核心代码
  1. public class UserAggrVo extends UserAggr {
  2.     private String deptName;
  3.     /**
  4.      * 很重要构造器
  5.      *
  6.      * @param user
  7.      */
  8.     public UserAggrVo(UserAggr user) {
  9.         super(user);
  10.     }
  11. }
复制代码
4、服务层调用

服务层完成调用
  1. public List<UserAggrVo> selectList3() {
  2.     LambdaQueryWrapper<UserAggr> wrapper = Wrappers.lambdaQuery(UserAggr.class)
  3.             .select(UserAggr::getDeptId, UserAggr::getCount)
  4.             .groupBy(UserAggr::getDeptId);
  5.     List<UserAggr> userAggrList = userAggrMapper.selectList(wrapper);
  6.     List<UserAggrVo> userAggrVoList = EntityUtils.toList(userAggrList, UserAggrVo::new);
  7.     // 给deptName完成属性赋值
  8.     Set<Long> deptIds = EntityUtils.toSet(userAggrVoList, UserAggrVo::getDeptId);
  9.     if (deptIds.size() > 0) {
  10.         List<Dept> deptList = deptMapper.selectList(Wrappers.lambdaQuery(Dept.class)
  11.                                                     .in(Dept::getDeptId, deptIds));
  12.         Map<Long, String> map = EntityUtils.toMap(deptList, Dept::getDeptId, Dept::getDeptName);
  13.         for (UserAggrVo userAggrVo : userAggrVoList) {
  14.             userAggrVo.setDeptName(map.get(userAggrVo.getDeptId()));
  15.         }
  16.     }
  17.     return userAggrVoList;
  18. }
复制代码
5、效果展示
  1. {
  2.   "code": 200,
  3.   "msg": "操作成功",
  4.   "data": [
  5.     {
  6.       "deptId": "10",
  7.       "count": "1",
  8.       "deptName": "Java"
  9.     },
  10.     {
  11.       "deptId": "11",
  12.       "count": "2",
  13.       "deptName": "Mysql"
  14.     },
  15.     {
  16.       "deptId": "12",
  17.       "count": "3",
  18.       "deptName": "Tomcat"
  19.     }
  20.   ]
  21. }
复制代码
三、总结

本方案很好的实现了MybatisPlus基于Lambda表达式实现聚合操作,代码在形式上与单表保持统一,代码优雅。各位看官朋友点赞支持一波。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表