单位门户网站怎么做,wordpress docker中文,王占山人物简介,开发一套小区多少钱#x1f389;工作中遇到这样一个需求场景#xff1a;实现一个统计查询#xff0c;要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说#xff0c;后端在实现分组查询的时候#xff0c;Group By 的字段是不确定的#xff0c;可能是一个字段、多个字段或者… 工作中遇到这样一个需求场景实现一个统计查询要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说后端在实现分组查询的时候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 标题)})LoginGetMapping(/xxxStatistics)public ResultMapString, ListStatisticsDO 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)) {ListString groupFieldList Arrays.asList(groupFields.split(Constants.COMMA_SPLIT));builder.put(groupFieldList, groupFieldList);}return xxxService.xxxStatistics(builder.build());}
}xxx-statistics-info-mapper.xml 文件代码如下
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespaceXxxStatisticsInfoMapperresultMap iddefault typeXxxStatisticsInfoDOresult columnid propertyid/result columntitle propertytitle/result columnxxx propertyxxx/result columnxxx propertyxxx/result columnxxx propertyxxx/result columnxxx propertyxxx/result columnxxx propertyxxx/result columnxxx propertyxxx/result columncreate_time propertycreateTime/result columnupdate_time propertyupdateTime//resultMapsql idqueryif teststartTime ! null and startTime ! AND alert_time gt; #{startTime}/ifif testendTime ! null and endTime ! AND alert_time lt; #{endTime}/if/sqlsql idqueryByGroupif testgroupFieldList ! null and groupFieldList.size() 0!-- 这里根据前端传入的参数拼接动态的 GROUP BY 子句 --GROUP BYforeach itemfield collectiongroupFieldList separator,${field}/foreach/if/sqlselect iddynamicGroupStatistics resultTypecom.xxx.xxx.domain.DynamicGroupStatisticsDOSELECTxxx,xxx,xxx,title,xxx,xxx,count(*) AS xxx_numFROM xxx_statistics_infowhereinclude refidquery/if testtitle ! null and title ! AND title #{title}/if/whereinclude refidqueryByGroup/ORDER BY xxx_num DESCLIMIT 30/select
/mapper