当前位置: 首页 > news >正文

【已解决】Mybatis 实现 Group By 动态分组查询

🎉工作中遇到这样一个需求场景:实现一个统计查询,要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说,后端在实现分组查询的时候,Group By 的字段是不确定的,可能是一个字段、多个字段或者不进行分组查询,这都是由用户在前端决定的。

💡这里给出的实现方案:

  • 前端界面收集用户需要分组统计的字段,然后将这些字段名组成一个字符串,字段名之间由逗号分隔,传递给后端。
  • 后端拿到分组字段名字符串再根据逗号分隔符进行处理,拼装成一个分组字段名列表。
  • 最后,利用 Mybatis 框架的动态 SQL 语句,实现动态分组字段的统计查询。

控制类XxxStatisticsController实现代码如下:

@RestController
@RequestMapping("/statistics")
public class XxxStatisticsController {@Autowiredprivate XxxService xxxService;@Operation(method = GET_METHOD, summary = "xxx动态分组统计直方图", parameters = {@Parameter(name = "startDate", description = "开始日期,形如:2023-07-01"),@Parameter(name = "endDate", description = "结束日期,形如:2023-07-10"),@Parameter(name = "groupFields", description = "需要分组的字段名称,逗号分隔,形如“level,title”"),@Parameter(name = "title", description = "标题")})@Login@GetMapping("/xxxStatistics")public Result<Map<String, List<StatisticsDO>>> xxxStatistics(@RequestParam String startTime,@RequestParam String endTime,@RequestParam(required = false) String groupFields,@RequestParam(required = false) String title) {QueryBuilder builder = QueryBuilder.page(0).pageSize(1);                                                    // 此处省略若干代码if (StringUtils.isNotBlank(groupFields)) {List<String> groupFieldList = Arrays.asList(groupFields.split(Constants.COMMA_SPLIT));builder.put("groupFieldList", groupFieldList);}return xxxService.xxxStatistics(builder.build());}
}

xxx-statistics-info-mapper.xml 文件代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="XxxStatisticsInfoMapper"><resultMap id="default" type="XxxStatisticsInfoDO"><result column="id" property="id"/><result column="title" property="title"/><result column="xxx" property="xxx"/><result column="xxx" property="xxx"/><result column="xxx" property="xxx"/><result column="xxx" property="xxx"/><result column="xxx" property="xxx"/><result column="xxx" property="xxx"/><result column="create_time" property="createTime"/><result column="update_time" property="updateTime"/></resultMap><sql id="query"><if test="startTime != null and startTime != ''">AND alert_time &gt;= #{startTime}</if><if test="endTime != null and endTime != ''">AND alert_time &lt;= #{endTime}</if></sql><sql id="queryByGroup"><if test="groupFieldList != null and groupFieldList.size() > 0"><!-- 这里根据前端传入的参数拼接动态的 GROUP BY 子句 -->GROUP BY<foreach item="field" collection="groupFieldList" separator=",">${field}</foreach></if></sql><select id="dynamicGroupStatistics" resultType="com.xxx.xxx.domain.DynamicGroupStatisticsDO">SELECTxxx,xxx,xxx,title,xxx,xxx,count(*) AS xxx_numFROM xxx_statistics_info<where><include refid="query"/><if test="title != null and title != ''">AND title = #{title}</if></where><include refid="queryByGroup"/>ORDER BY xxx_num DESCLIMIT 30</select>
</mapper>
http://www.lryc.cn/news/152552.html

相关文章:

  • Android修改默认gradle路径
  • 原生JS+canvas实现炫酷背景
  • Linux学习之NAS服务器搭建
  • 分享码云上8个宝藏又有价值的开源图片编辑器
  • TCP Header都有啥?
  • 无涯教程-Android - AutoCompleteTextView函数
  • 【Docker】 07-安装ElasticSearch、Kibana
  • 【数据结构篇】线性表1 --- 顺序表、链表 (万字详解!!)
  • C语言每日一练--Day(17)
  • 8月琐碎但值得的事情
  • 苹果Mac系统如何优化流畅的运行?提高运行速度
  • Python 类和对象
  • VC++使用Microsoft Speech SDK进行文字TTS朗读
  • FFmpeg4.3.1+h264在windows下编译与VS2017项目集成
  • mapboxGL3新特性介绍
  • 类ChatGPT大模型LLaMA及其微调模型
  • 50个简洁的提示提高代码可读性和效率(0-10)
  • Linux —— 进程信号
  • Android笔记 自定义控件时drawText字符串宽度的3种计算方式
  • ChatRWKV 学习笔记和使用指南
  • Particle Life粒子生命演化的MATLAB模拟
  • golang中byte和rune的区别?
  • AI图像行为分析算法 opencv
  • MATLAB制图代码【第二版】
  • 5.0: Dubbo服务导出源码解析
  • python自动化测试-自动化基本技术原理
  • lodash 之 _.isEmpty
  • layui数据表格实现表格中嵌套表格,并且可以折叠展开
  • 云端笔记系统-自动化测试
  • 将帅要避免五个方面的弱点:蛮干、怕死、好名、冲动、溺爱民众