首先,我们要知道,其实LambdaQueryWrapper是无法使用sum聚合函数的,因为LambdaQueryWrapper的select()方法无法传入字符串,但你有张良计,我有过墙梯,我们其实可以迂回来做。

先使用QueryWrapper,拼接我们需要的select,然后再转成LambdaQueryWrapper,具体如下:

order对象:(简单写需要的东西)

@Data
@TableName("t_order")
public class OrderModel {/*** 商户号*/private String merNo;/*** 订单号*/private BigDecimal orderId;/*** 手续费*/private BigDecimal feeAmt;/*** 到账金额*/private BigDecimal arrivalAmt;/*** 交易时间*/private LocalDate tradeDate;
}

代码如下:

Page<OrderModel> page = orderService.page(new Page<>(1, 20), new QueryWrapper<OrderModel>().select(" SUM(fee_amt) AS fee_amt, SUM(arrival_amt) AS arrival_amt, mer_no ").lambda().between(StrUtil.isNotBlank(commandReq.getStartDate()) && StrUtil.isNotBlank(commandReq.getEndDate()),OrderModel::getTradeDate,StrUtil.isNotBlank(startDateStr) ? LocalDate.parse(startDateStr) : null,StrUtil.isNotBlank(endDateStr) ? LocalDate.parse(cendDateStr) : null)  .groupBy(OrderModel::getMerNo));

分页查询,按照商户号进行分组,手续费和到账金额进行汇总,如果时间不为空,用between范围查询。
先用QueryWrapper处理掉聚合函数,然后再用.lambda()转成LambdaQueryWrapper,保证下面能用lambda写法。
SUM(fee_amt)直接丢在fee_amt里,就不用去新加属性了,如果不想,可以再加个对象里补个汇总字段。

@TableField(exist = false)
private BigDecimal FeeTotalAmt;

进行扩展,如果我们想多查一个订单号orderNo,第一种写法可以这样写:

.select(" SUM(fee_amt) AS fee_amt, SUM(arrival_amt) AS arrival_amt, mer_no, order_no ")
.lambda()

但是这样写的坏处就是,不够优雅,而且如果在java里改了属性名,会导致查询出问题,这也是我们想用LambdaQueryWrapper的原因。

但如果按照下面这种写法,也存在问题:

.select(" SUM(fee_amt) AS fee_amt, SUM(arrival_amt) AS arrival_amt, mer_no ")
.lambda()
.select(OrderModel::getOrderNo)

这样写会导致我们在QueryWrapper写的select被LambdaQueryWrapper覆盖调。所以第二种做法行不通,但不想用第一种写法,想用lambda,那么就得解决第二种写法出现的问题。

通过查看LambdaQueryWrapper的select方法,发现它是使用SFunction接收参数,并把参数使用stream流转成字符串。


那么,具体思路就有了,我们把SFunction根据流的方式,转成字符串,代码如下:

    /*** 处理sql查询字段名* @param columns* @return*/private String getParamSql(SFunction<OrderModel, ?>... columns) {return Arrays.stream(columns).map(c -> StrUtil.toUnderlineCase(LambdaUtils.getName(c))).collect(Collectors.joining(StringPool.COMMA, StringPool.SPACE, StringPool.SPACE));}

通过Arrays.stream()为可变数组创建流,然后使用LambdaUtils.getName()方法获取属性名,再用StrUtil.toUnderlineCase()把属性名从,小驼峰转成下划线,最后用.collect(Collectors.joining())拼成字符串,用逗号分隔,前后加空格。

然后我们就可以通过这个方法使用lambda啦,因为入参是用可变数组,所以所以传入多个,这里只传入一个orderNo。

.select(" SUM(fee_amt) AS fee_amt, SUM(arrival_amt) AS arrival_amt, mer_no ", getParamSql(OrderModel::getOrderNo))
.lambda()

完整代码如下:

Page<OrderModel> page = orderService.page(new Page<>(1, 20), new QueryWrapper<OrderModel>().select(" SUM(fee_amt) AS fee_amt, SUM(arrival_amt) AS arrival_amt, mer_no ", getParamSql(OrderModel::getOrderNo)).lambda().between(StrUtil.isNotBlank(commandReq.getStartDate()) && StrUtil.isNotBlank(commandReq.getEndDate()),OrderModel::getTradeDate,StrUtil.isNotBlank(startDateStr) ? LocalDate.parse(startDateStr) : null,StrUtil.isNotBlank(endDateStr) ? LocalDate.parse(cendDateStr) : null)  .groupBy(OrderModel::getMerNo));

虽然看起来还是不够优雅,但是我觉得已经是最优的方案了,如果有更好的写法,可以在评论区留言。
写法绝对是本人自己思考后写出来的,因为在网上搜了一个多小时,也没看到什么更优雅的写法,如果本篇文章对你有帮助的话,就动动点击下方大拇指,给个免费的赞,不然我真的会谢。

LambdaQueryWrapper使用 group分组、sum聚合函数 进行统计,并分页排序相关推荐

  1. MySQL笔记-group by和聚合函数的使用

    group by:其实就是分组,把同类的组,数据放到一起,然后用聚合函数去统计.下面是详细的说明. 对应的SQL如下: SELECT * FROM fund_earning_2022 ORDER BY ...

  2. Mysql里where语句里不能使用SUM聚合函数筛选怎么办?

    现有这样一个需求: 在一个电商订单管理平台中,我想查看所有已付款订单中,哪些订单是有部分退款的. 一开始思路是这样是没错的: 在订单详情表里的num数量和大于退款详情表里的num数量之和即可,也就是S ...

  3. SQL干货丨关于分组和聚合函数,如何实现查询排名?!

    一. 需求分析 我们在学习数据库查询时,经常会遇到关于分组和聚合函数的查询,比如查询每门课程的最高分,每位同学的平均分,其实这些都是比较一般的问题.但如果遇到查询每门课程成绩的前几名问题,就会变的很棘 ...

  4. 【数据库演练】外键SQL语句的编写分组和聚合函数的组合使用

    外键SQL语句的编写 外键SQL语句的编写 1. 外键约束作用 2. 对于已经存在的字段添加外键约束 3. 在创建数据表时设置外键约束 4. 删除外键约束 5. 小结 演练-分组和聚合函数的组合使用 ...

  5. oracle sum详解,oracle sum()聚合函数

    原文链接:https://blog.csdn.net/cizatu5130/article/details/100291347 oracle sum()聚合函数 2016-05-13 20:08:00 ...

  6. tp5使用sum()聚合函数分组查询

    数据查询出来大概是这个样子(实际应用中会很复杂,这里造一些类似的数据,用来举例说明) 简单的查询 $data = Db::name('order')->field('sum(money) as ...

  7. group by配合“聚合函数”才有意义

    group by 从英文里理解就是分组.有"聚合函数"来配合才有意义 例如上表:如果 select name from score GROUP BY name 只能得到一组姓名,其 ...

  8. sql聚合分组查询-聚合函数

    文章目录 知识 题目1 常规解法1: 解法2: 解法3: 解法4: 解法5(利用专用窗口函数:rank.dense_rank.row_number): 题目2 解1:用if条件函数 解2:在聚合函数中 ...

  9. group by和聚合函数

    作者:pyai.top  来源:CSDN  原文:https://blog.csdn.net/intmainhhh/article/details/80777582  版权声明:本文为博主原创文章,转 ...

最新文章

  1. cuGraph-GPU图形分析
  2. 云计算如何对传统软件交付方式产生影响
  3. OpenCV简单的几何绘图的实例(附完整代码)
  4. 2021年广西高考成绩查询方法,2021年广西高考成绩查询网站查分网址:https://www.gxeea.cn/...
  5. IntelliJ IDEA 配置JDK
  6. Python OrderedDict
  7. 软件事务内存导论(五)创建嵌套事务
  8. java jackson注意_Jackson注意事项
  9. 批量检查pdb数据库某些蛋白质的pdb文件是否存在
  10. 微信扫一扫二维码直接打开手机外部浏览器
  11. 计算机组成原理答案 耿,计算机组成理习题课2.ppt
  12. Matlab系列之三维图形
  13. android 投屏 电脑,安卓王者荣耀投屏电脑
  14. 一个服务器放多个网站seo,服务器建立多个网站 同一IP对SEO有影响吗
  15. 测试的意义并不是能找到全部的缺陷
  16. 微信小程序 - - 授权登录退出和缓存
  17. 字符串的子串计算方法
  18. Node.js:fs文件模块的替代品fs-extra
  19. 【图像去噪】空域+频域滤波图像去噪【含GUI Matlab源码 914期】
  20. 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)

热门文章

  1. 项目管理 :团队管理中如何激励员工
  2. GTA5没声音解决方案记录
  3. 新浪微博技巧之——修改来自(iPhone客户端/)
  4. CleanMyMac X4.11.1版本一款好用的Mac清理和优化工具
  5. 提高Alexa排名的九个方法
  6. 简单的spring项目搭建流程
  7. 冲刺第五轮学科评估!这些“双非”高校来了!
  8. CSDN博客专家申请流程(个人)
  9. 浙江农林大学计算机科学与技术考研多吗,浙江农林大学暨阳学院计算机科学与技术考研...
  10. CodeIgniter框架之数据库操作