LambdaQueryWrapper使用 group分组、sum聚合函数 进行统计,并分页排序
首先,我们要知道,其实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聚合函数 进行统计,并分页排序相关推荐
- MySQL笔记-group by和聚合函数的使用
group by:其实就是分组,把同类的组,数据放到一起,然后用聚合函数去统计.下面是详细的说明. 对应的SQL如下: SELECT * FROM fund_earning_2022 ORDER BY ...
- Mysql里where语句里不能使用SUM聚合函数筛选怎么办?
现有这样一个需求: 在一个电商订单管理平台中,我想查看所有已付款订单中,哪些订单是有部分退款的. 一开始思路是这样是没错的: 在订单详情表里的num数量和大于退款详情表里的num数量之和即可,也就是S ...
- SQL干货丨关于分组和聚合函数,如何实现查询排名?!
一. 需求分析 我们在学习数据库查询时,经常会遇到关于分组和聚合函数的查询,比如查询每门课程的最高分,每位同学的平均分,其实这些都是比较一般的问题.但如果遇到查询每门课程成绩的前几名问题,就会变的很棘 ...
- 【数据库演练】外键SQL语句的编写分组和聚合函数的组合使用
外键SQL语句的编写 外键SQL语句的编写 1. 外键约束作用 2. 对于已经存在的字段添加外键约束 3. 在创建数据表时设置外键约束 4. 删除外键约束 5. 小结 演练-分组和聚合函数的组合使用 ...
- oracle sum详解,oracle sum()聚合函数
原文链接:https://blog.csdn.net/cizatu5130/article/details/100291347 oracle sum()聚合函数 2016-05-13 20:08:00 ...
- tp5使用sum()聚合函数分组查询
数据查询出来大概是这个样子(实际应用中会很复杂,这里造一些类似的数据,用来举例说明) 简单的查询 $data = Db::name('order')->field('sum(money) as ...
- group by配合“聚合函数”才有意义
group by 从英文里理解就是分组.有"聚合函数"来配合才有意义 例如上表:如果 select name from score GROUP BY name 只能得到一组姓名,其 ...
- sql聚合分组查询-聚合函数
文章目录 知识 题目1 常规解法1: 解法2: 解法3: 解法4: 解法5(利用专用窗口函数:rank.dense_rank.row_number): 题目2 解1:用if条件函数 解2:在聚合函数中 ...
- group by和聚合函数
作者:pyai.top 来源:CSDN 原文:https://blog.csdn.net/intmainhhh/article/details/80777582 版权声明:本文为博主原创文章,转 ...
最新文章
- cuGraph-GPU图形分析
- 云计算如何对传统软件交付方式产生影响
- OpenCV简单的几何绘图的实例(附完整代码)
- 2021年广西高考成绩查询方法,2021年广西高考成绩查询网站查分网址:https://www.gxeea.cn/...
- IntelliJ IDEA 配置JDK
- Python OrderedDict
- 软件事务内存导论(五)创建嵌套事务
- java jackson注意_Jackson注意事项
- 批量检查pdb数据库某些蛋白质的pdb文件是否存在
- 微信扫一扫二维码直接打开手机外部浏览器
- 计算机组成原理答案 耿,计算机组成理习题课2.ppt
- Matlab系列之三维图形
- android 投屏 电脑,安卓王者荣耀投屏电脑
- 一个服务器放多个网站seo,服务器建立多个网站 同一IP对SEO有影响吗
- 测试的意义并不是能找到全部的缺陷
- 微信小程序 - - 授权登录退出和缓存
- 字符串的子串计算方法
- Node.js:fs文件模块的替代品fs-extra
- 【图像去噪】空域+频域滤波图像去噪【含GUI Matlab源码 914期】
- 超详细的逐句介绍Java网络编程之Socket类函数源码讲解(全)
热门文章
- 项目管理 :团队管理中如何激励员工
- GTA5没声音解决方案记录
- 新浪微博技巧之——修改来自(iPhone客户端/)
- CleanMyMac X4.11.1版本一款好用的Mac清理和优化工具
- 提高Alexa排名的九个方法
- 简单的spring项目搭建流程
- 冲刺第五轮学科评估!这些“双非”高校来了!
- CSDN博客专家申请流程(个人)
- 浙江农林大学计算机科学与技术考研多吗,浙江农林大学暨阳学院计算机科学与技术考研...
- CodeIgniter框架之数据库操作