背景

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

需求

现在有一张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. 钉钉H5微应用本地开发调试记录

    准备工具: 手机(ios,安卓) 安卓手机可以用网易Mumu模拟器,下载一个移动版钉钉 钉钉开放文档 本地开发的话,可以去钉钉后台管理系统,将你的本地ip地址配置成应用的首页,比如 10.xx.xx. ...

  2. .NET 9 的新亮点:AI就绪 ,拥抱她

    .NET 9 即将发布 RC1, 今年初.NET 团队在发布.NET 9 Preview 1版本时写了一篇文章<我们对 .NET 9 的愿景>,其中特别提到了对AI的展望 .NET 9,我 ...

  3. hexo使用小技巧

    1.在博客中加入图片 使用语法 {% asset_img 1.jpg %} 这样hexo会自动渲染1.jpg.,然后1.jpg的位置需要放在同文件名的文件夹中,比如这篇博客叫hexo使用小技巧,那么这 ...

  4. SoftCLT: 时间序列的软对比学习《Soft Contrastive Learning for Time Series》(时间序列、时序分类任务、软对比学习、实例上软赋值距离差异、数据空间非嵌入空间度量相似性)

    2024年6月25日,10:11,好几天没看论文了,一直在摸鱼写代码(虽然也没学会多少),今天看一篇师兄推荐的. 论文:Soft Contrastive Learning for Time Serie ...

  5. 系统编程-进程-当fork遇到管道,可能碰撞出什么?

    第一部分 1. 直接上代码 #include <stdio.h> #include <unistd.h> #include <stdlib.h> int globv ...

  6. std::variant快速上手

    std::variant 是 C++17 引入的一种类型安全的联合体,用来存储多个可能类型中的一种值,且保证使用时的类型安全.相比于传统的 union,std::variant 不仅能够存储不同类型的 ...

  7. Idea启动多服务时的Dashboard展示

    1.提换.idea/workspace.xml文件中的RunDashboard标签 <component name="RunDashboard"> <option ...

  8. 云原生周刊:Docker大涨价|2024.10.8

    开源项目推荐 Kubeshark 如果把 K8s 比作操作系统,那它就是 K8s 上的 tcpdump,使用起来就像 Chrome 开发者工具一样简单直接,能够让 K8s 上微服务之间的网络通信一览无 ...

  9. 探索 Kubernetes 持久化存储之 Rook Ceph 初窥门径

    在 Kubernetes 生态系统中,持久化存储是支撑业务应用稳定运行的基石,对于维护整个系统的健壮性至关重要.对于选择自主搭建 Kubernetes 集群的运维架构师来说,挑选合适的后端持久化存储解 ...

  10. KubeSphere 社区双周报 | Fluent Operator 2.6.0 发布 | 2023.11.10-11.23

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...