Mybatis 实现多字段动态排序
背景
在项目的开发过程中,可能会遇到对数据表多个字段
进行排序的需求(第一句话就这么难懂,不要害怕,万事开头难,结尾更难,开玩笑哒),结合需求轻松易懂。
需求
现在有一张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 实现多字段动态排序的更多相关文章
- c# ef 排序字段动态,构建动态Lambda和扩展方法OrderBy
1.动态构建排序 Lambda /// <summary> /// 获取排序Lambda(如果动态排序,类型不同会导致转换失败) /// </summary> /// < ...
- mybatis动态排序
如果我们要传入排序字段作为一个参数到mybatis中,用以实现按照指定字段来排序的功能,那么我们需要使用$,而不是像其他参数一样,使用#.如下所示. <if test="sortnam ...
- MySQL 按照数据库表字段动态排序 查询列表信息
MySQL 按照数据库表字段动态排序 查询列表信息 背景描述 项目中数据列表分页展示的时候,前端使用的Table组件,每列自带对当前页的数据进行升序或者降序的排序. 但是客户期望:随机点击某一列的时候 ...
- ActiveReports 报表应用教程 (9)---交互式报表之动态排序
在 ActiveReports 中除了提供对数据源进行排序的功能之外,还提供了最终用户排序功能,最终用户可以对报表进行区域内排序和整个数据源排序,结合数据钻取.过滤等功能可以让用户更方便地分析报表数据 ...
- linq扩展之动态排序
前两天看QQ群里面,一位朋友问的问题,说在linq中怎么实现动态排序呢,自己想了半天,没有头绪,网上找了下相关的资料,看了下,收益挺多,记录下来. 之前我们没有如果不知道动态排序的方法的话,我们可能会 ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(17)-LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为s ...
- LinQ动态排序
LinQ动态排序 首先修复程序中的一个BUG这个BUG在GridPager类中,把sord修改为sort这个名称填写错误,会导致后台一直无法获取datagrid的排序字段 本来是没有这一讲的,为了使2 ...
- 写一个针对IQueryable<T>的扩展方法支持动态排序
所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...
- Mybatis输入输出映射_动态sql_关联关系(一对一、一对多、多对多)
Mybatis输入输出映射_动态sql_关联关系(一对一.一对多.多对多)输入输出映射parameterType完成输入映射parameterType可以传入的参数有,基本数据类型(根据id查询用户的 ...
- SSM框架之Mybatis(6)动态SQL
Mybatis(6)动态SQL 1.动态SQL 出现原因:有些时候业务逻辑复杂时,我们的 SQL 是动态变化的,此时在前面的学习中我们的 SQL 就不能满足要求了 1.1.if标签 我们根据实体类的不 ...
随机推荐
- EF Core – 大杂烩
前言 记入一些零零碎碎的知识. Shadow Properties 参考:Docs – Shadow and Indexer Properties Shadow Property 指的是那些在数据库有 ...
- JavaScript – ES Module
前言 关于 JavaScript Modular 的多种版本和历史看这篇. 参考: 阮一峰 – Module 的语法 阮一峰 – Module 的加载实现 Export 语法 逐个 export 在想 ...
- SQL Server – 我常用语句
前言 旧没用又忘记了, 又没有 intellisense, 记入这里吧. Reset Auto Increment DBCC CHECKIDENT ('TableName'); -- check cu ...
- 系统编程-进程-fork深度理解、vfork简介
1. fork基本使用 #include <unistd.h> #include <stdio.h> int main(){ pid_t pid = fork(); if(pi ...
- 系统编程-进程-close-on-exec机制
我的相关博文: 系统编程-进程-exec系列函数超级详解(带各种实操代码) 一般我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈等. 此时保存文件描述符的变量当然也不 ...
- P1438 无聊的数列 题解
背景 看到题解都是差分,竟然还有建两颗线段树和二阶差分的大佬. 我感到不理解,很不理解. 题目正解 本题正解很明显就是:线段树 是的,你没有看错,就只有线段树. 很显然我们直接按照线段树板题写就可以了 ...
- 在windows下安装Composer(转载)
在windows下安装Composer Composer是 PHP 用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer ...
- 七张图看懂 Linux profiling 机制
1 图 1 Linux profiling 手段一览 软件埋点: 手动埋点:主动调用 trace 函数来实现埋点. Android systrace 即是这样一个例子,如图 2 和 图 3 所示 自动 ...
- webpack中 ,有哪些常见的Loader?他们是解决什么问题的?
1. css-loader 翻译css ,可以把sass / less 代码翻译成 css 代码 : 2. imgage-loader 加载并压缩图片文件 3. source-map-loader 加 ...
- Android复习(四)-->权限汇总
官方地址: https://developer.android.google.cn/reference/android/Manifest.permission#public-constructors ...