背景

在项目的开发过程中,可能会遇到对数据表多个字段进行排序的需求(第一句话就这么难懂,不要害怕,万事开头难,结尾更难,开玩笑哒),结合需求轻松易懂。

需求

现在有一张User表

男同学先按 age 字段降序排序,后按 height 字段降序排序,最后按 id 升序排序

女同学先按 age 升序排序,后按 weight 降序排序,最后按 id 升序排序

需求不合理?就说你能不能做,不能做滚蛋。

实现

创建排序对(字段名,排序类型)

@Data
public class SortFieldPair{
private String fieldName;
private String sortType; public SortFieldPair(String fieldName, String sortType) {
this.fieldName = fieldName;
this.sortType = sortType;
}
}

根据策略构建排序对

使用list,排序对才能有序。(eg. 先按身高排序再按体重排序 vs 先按体重排序再按身高排序)

private List<SortFieldPair> buildUserSortList(UserSearchParam userSearchParam) {
List<SortFieldPair> res = new ArrayList<>();
if(userSearchParam.getSex == "man") {
res.add(new SortFieldPair("age", SortOrder.DESC.toString()));
res.add(new SortFieldPair("height", SortOrder.DESC.toString()));
} else if(userSearchParam.getSex == "woman") {
res.add(new SortFieldPair("age", SortOrder.ASC.toString()));
res.add(new SortFieldPair("weight", SortOrder.DESC.toString()));
}
res.add(new SortFieldPair("id", SortOrder.ASC.toString()));
return res;
}

dao层实现

List<UseroVO> queryListByParam(
@Param("sortFieldList") List<SortFieldPair> sortFieldPairs,
@Param("start") int start,
@Param("limit") int limit);

mapper层实现

注意使用 ${}#{} 会为表字段加 '' 使变量变为字符串,(eg. name => 'name' ),导致SQL失效。

<select id="queryListByParam" resultType="com.tao.vo.result.UserVO">
select * FROM sys_user WHERE is_del=0
<foreach collection="sortFieldList" item="sortField" open="order by " separator="," close=" ">
${sortField.fieldName} ${sortField.sortType}
</foreach>
LIMIT #{limit} OFFSET #{start}
</select>

最后

对于多字段进行排序,记得在排序字段加索引,当数据库量大的时候没加索引的排序会出现慢SQL。

Mybatis 实现多字段动态排序的更多相关文章

  1. c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy

    1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...

  2. mybatis动态排序

    如果我们要传入排序字段作为一个参数到mybatis中,用以实现按照指定字段来排序的功能,那么我们需要使用$,而不是像其他参数一样,使用#.如下所示. <if test="sortnam ...

  3. MySQL 按照数据库表字段动态排序 查询列表信息

    MySQL 按照数据库表字段动态排序 查询列表信息 背景描述 项目中数据列表分页展示的时候,前端使用的Table组件,每列自带对当前页的数据进行升序或者降序的排序. 但是客户期望:随机点击某一列的时候 ...

  4. ActiveReports 报表应用教程 (9)---交互式报表之动态排序

    在 ActiveReports 中除了提供对数据源进行排序的功能之外,还提供了最终用户排序功能,最终用户可以对报表进行区域内排序和整个数据源排序,结合数据钻取.过滤等功能可以让用户更方便地分析报表数据 ...

  5. linq扩展之动态排序

    前两天看QQ群里面,一位朋友问的问题,说在linq中怎么实现动态排序呢,自己想了半天,没有头绪,网上找了下相关的资料,看了下,收益挺多,记录下来. 之前我们没有如果不知道动态排序的方法的话,我们可能会 ...

  6. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为s ...

  7. LinQ动态排序

    LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段 本来是没有这一讲的,为了使2 ...

  8. 写一个针对IQueryable<T>的扩展方法支持动态排序

    所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...

  9. Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)

    Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...

  10. SSM框架之Mybatis(6)动态SQL

    Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...

随机推荐

  1. dfs 验证搜索二叉树——leetcode98

    代码来自leetcode官方 一开始我自己写这个代码时只注意当前节点是否会存在空指针,并没有注意到他的孩子节点也有可能为空,绕了我好久...... /** * Definition for a bin ...

  2. JVM--解析运行期优化与JIT编译器

    JVM开发团队一直在努力,缩小Java与C/C++语言在运行效率上的差距. 本篇博客,我们来谈一谈JVM(HotSpot)为了提高Java程序的运行效率,都实现了哪些激动人心的技术- 1 JIT编译器 ...

  3. KASAN 中kasan_multi_shot 的作用

    kasan_multi_shot 是 Linux 内核配置选项之一,与 Kernel Address Sanitizer (KASAN) 相关.KASAN 是一种内核内存错误检测工具,能够检测内核代码 ...

  4. Android MTP流程

    概要 本文的目的是介绍Android系统中MTP的一些相关知识.主要的内容包括:第1部分 MTP简介 对Mtp协议进行简单的介绍.第2部分 MTP框架 介绍Android系统下MTP的框架.第3部分 ...

  5. 018 人生中第一次用 Python 写的一个小程序_猜年龄(再次强调,重视基础)

    博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https:// ...

  6. K8s GPU 资源管理探索:在 KubeSphere 上部署 AI 大模型 Ollama

    作者:运维有术星主 随着人工智能.机器学习.AI 大模型技术的迅猛发展,我们对计算资源的需求也在不断攀升.特别是对于需要处理大规模数据和复杂算法的 AI 大模型,GPU 资源的使用变得至关重要.对于运 ...

  7. 基于Jenkins + Argo 实现多集群的持续交付

    作者:周靖峰,青云科技容器顾问,云原生爱好者,目前专注于 DevOps,云原生领域技术涉及 Kubernetes.KubeSphere.Argo. 前文概述 前面我们已经掌握了如何通过 Jenkins ...

  8. 你真的理解 Kubernetes 中的 requests 和 limits 吗?

    在 Kubernetes 集群中部署资源的时候,你是否经常遇到以下情形: 经常在 Kubernetes 集群种部署负载的时候不设置 CPU requests 或将 CPU requests 设置得过低 ...

  9. T3 出行云原生容器化平台实践

    公司简介 T3 出行是南京领行科技股份有限公司打造的智慧出行生态平台,由中国第一汽车集团有限公司.东风汽车集团有限公司.重庆长安汽车股份有限公司发起,联合腾讯.阿里巴巴等互联网企业共同投资打造.公司以 ...

  10. 题解:P9788 [ROIR 2020 Day2] 区域规划

    题目传送门 洛谷题解 思路 首先我们看下数据范围, \(n <= 3000\) ,范围很小,所以暴力枚举. 于是第一份代码出来了. #include<bits/stdc++.h> u ...