LambdaQueryWrapper 设置自定义排序

这篇具有很好参考价值的文章主要介绍了LambdaQueryWrapper 设置自定义排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MybatisPlus版本

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.2</version>
</dependency>
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-extension</artifactId>
    <version>3.4.2</version>
</dependency>

定义MybatisPlus工具类

import com.baomidou.mybatisplus.core.conditions.ISqlSegment;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.xnt.product.common.core.core.domain.OrderBy;
import com.xnt.product.common.core.exception.CustomException;

import java.util.List;

import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;

/**
 * @author wxm
 */
public class MybatisPlusUtil {

    /**
     * @param queryWrapper {@link LambdaQueryWrapper}
     * @param column       排序字段
     * @param asc          是否升序
     * @param <T>          泛型
     */
    public static <T> void setOrderOne(LambdaQueryWrapper<T> queryWrapper, String column, boolean asc) {
        try {
            ISqlSegment[] sqlSegments = {ORDER_BY, () -> column, asc ? ASC : DESC};
            queryWrapper.getExpression().add(sqlSegments);
        } catch (Exception e) {
            e.printStackTrace();
            throw new CustomException("设置排序出错:" + e.getMessage());
        }
    }

    /**
     * @param queryWrapper {@link LambdaQueryWrapper}
     * @param order        {@link OrderBy} 排序
     * @param <T>          泛型
     */
    public static <T> void setOrder(LambdaQueryWrapper<T> queryWrapper, OrderBy order) {
        setOrderOne(queryWrapper, order.getColumn(), order.isAsc());
    }

    /**
     * @param queryWrapper {@link LambdaQueryWrapper}
     * @param list         {@link OrderBy} 排序
     * @param <T>          泛型
     */
    public static <T> void setOrder(LambdaQueryWrapper<T> queryWrapper, List<OrderBy> list) {
        for (OrderBy order : list) {
            setOrder(queryWrapper, order);
        }
    }

    /**
     * @param queryWrapper {@link LambdaQueryWrapper}
     * @param orderItem    {@link OrderItem} 排序
     * @param <T>          泛型
     */
    public static <T> void setOrderItem(LambdaQueryWrapper<T> queryWrapper, OrderItem orderItem) {
        setOrderOne(queryWrapper, orderItem.getColumn(), orderItem.isAsc());
    }

    /**
     * @param queryWrapper {@link LambdaQueryWrapper}
     * @param list         {@link OrderItem} 排序
     * @param <T>          泛型
     */
    public static <T> void setOrderItem(LambdaQueryWrapper<T> queryWrapper, List<OrderItem> list) {
        for (OrderItem order : list) {
            setOrderItem(queryWrapper, order);
        }
    }
}

定义OrderBy实体类

@Data
public class OrderBy {

    /**
     * 字段名称
     */
    @NotEmpty
    private String column;


    /**
     * 排序类型 升序:asc 降序:desc
     * 默认升序
     */
    private boolean asc = true;

    /**
     * 是否进行驼峰转下划线
     */
    private boolean toUnder = false;


    public String getColumn() {
        return isToUnder() ? StrUtil.toUnderlineCase(column) : column;
    }

    public String getColumn(boolean toUnder) {
        return toUnder ? StrUtil.toUnderlineCase(column) : column;
    }

    /**
     * 获取 OrderItem
     *
     * @return
     */
    public OrderItem getOrderItem() {
        return getOrderItem(isAsc(), isToUnder());
    }

    /**
     * 获取 OrderItem
     *
     * @param isAsc 是否升序
     * @return
     */
    public OrderItem getOrderItem(boolean isAsc) {
        return getOrderItem(isAsc, isToUnder());
    }

    /**
     * 获取 OrderItem
     *
     * @param isToUnder 是否进行驼峰转下划线
     * @return
     */
    public OrderItem getOrderItemToUnder(boolean isToUnder) {
        return getOrderItem(isAsc(), isToUnder);
    }

    /**
     * 获取 OrderItem
     *
     * @param sort      排序方式  升序:asc 降序:desc
     * @param isToUnder 是否进行驼峰转下划线
     * @return
     */
    public OrderItem getOrderItem(String sort, boolean isToUnder) {
        return getOrderItem(isAsc(), isToUnder);
    }

    /**
     * 获取 OrderItem
     *
     * @param isAsc     是否升序
     * @param isToUnder 是否进行驼峰转下划线
     * @return
     */
    public OrderItem getOrderItem(boolean isAsc, boolean isToUnder) {
        String col = isToUnder ? StrUtil.toUnderlineCase(column) : column;
        return OrderItemUtils.getOrder(col, isAsc);
    }

    /**
     * 获取sql
     * @return
     */
    public String getSql(){
        return (isToUnder() ? StrUtil.toUnderlineCase(column) : column) + (this.isAsc()? " asc":" desc");
    }
 }

使用自定义排序

1、获取前段参数

public List<OrderBy> getOrderBys() {
        String order = ServletUtils.getParameter(PageConstants.ORDER);
        if (ObjectUtil.isEmpty(order)) {
            return null;
        }
        List<OrderBy> orderByList = new ArrayList<>();
        if (JsonUtil.isTypeJSONArray(order)) {
            orderByList.addAll(JsonUtil.toList(order, OrderBy.class));
        } else {
            orderByList.add(JsonUtil.parse(order, OrderBy.class));
        }
        return orderByList;
    }

2、调用工具类

public List<SysOperLog> getList(SysOperLog operLog) {
        LambdaQueryWrapper<SysOperLog> lambda = getLambda();
   
        List<OrderItem> list = getOrderItems();
        if (ObjectUtils.isNotEmpty(list)) {
            MybatisPlusUtil.setOrderItem(lambda, list);
        } else {
            lambda.orderByDesc(SysOperLog::getOperTime);
        }
        return super.list(lambda);
    }

文章来源地址https://www.toymoban.com/news/detail-509476.html

到了这里,关于LambdaQueryWrapper 设置自定义排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MybatisPlus快速入门及常见设置

    目录 一、快速入门 1.1 准备数据 1.2 创建SpringBoot工程 1.3 使用MP 1.4 获取Mapper进行测试  二、常用设置 2.1 设置表映射规则 2.1.1 单独设置 2.1.2 全局设置 2.2 设置主键生成策略  2.2.1 为什么会有雪花算法? 2.2.2 垂直分表 2.2.3 水平分表 2.2.4 单独设置 2.2.5 全局设置 2.3 设置字段映射

    2024年02月19日
    浏览(24)
  • 开箱即用之MyBatisPlus XML 自定义分页

    2024年01月19日
    浏览(43)
  • MybatisPlus自定义insertBatchSomeColumn实现真正批量插入(Oracle)

    项目由于插入数据量比较大,导致前端请求超时,查看系统代码发现是通过循环单条插入,因此准备先从输入批量写入开始优化,通过查询资料发现有几种方式: 1. 通过实现MybatisPlus IService接口,获取saveBatch, 底层其实是单条插入 2. 通过XML手动拼接SQL实现批量插入, 缺点是每

    2024年02月16日
    浏览(32)
  • IDEA集成EasyCode插件,快速生成自定义mybatisplus代码

    在idea插件中,搜索EasyCode插件,下载并进行安装。  easyCode插件可以修改作者名称,即生成代码后,注释中自动添加相应作者的姓名。  Type Mapper指的是生成mapper.xml文件中数据库中的字段和java中代码的字段以及生成mybatis数据之间的类型转换。最常见的形式如下,也就是java中的

    2024年02月06日
    浏览(31)
  • mybatisplus在新增或者修改时设置字段自动填充

    1、需要实现元对象字段填充控制器抽象类,如下代码 fieldName要注意对应的生成的实体字段,不是数据库对应字段,否则无效 2、在生成的实体字段,@TableField增加fill填充,并写入填充的时机是新增还是修改 在此过程中可能会出现的错: 修改或者插入的时候报类型无效,jav

    2024年01月17日
    浏览(44)
  • MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口

    MyBatisPlus详解系列文章: MyBatisPlus详解(一)项目搭建、@TableName、@TableId、@TableField注解与常见配置 2.1.1 Wrapper 在BaseMapper接口提供的相关方法中,除了以id作为where条件, 还支持更加复杂的where条件,即条件构造器Wrapper : Wrapper是条件构造器的抽象类,其下有很多默认实现,继承

    2024年04月25日
    浏览(40)
  • Mybatisplus 传参参数为自定义sql, 使用条件构造器作为参数

    1 pom依赖 2 mapper 接口文件 3 mapper 的xml配置文件 4 查询 5 测试,生成的两个sql语句如下 注意 :不同的版本,可能会有部分区别,总之注意下版本

    2024年02月22日
    浏览(41)
  • idea 插件 Easy Code 自定义 MybatisPlus 模板一键快速生成所需代码

    之前无意中了解到了 idea 中的 Easy Code 插件,说是能快速生成 entity 、mapper、service、controller 等文件,避免很多简单重复性的创建工作,大大提高 MySQL 增删改查的开发效率。 正好今天要做对 MySQL 的增删改查,想着试试这个插件,没想到,特别好用,但也需要自己定制,所以就

    2023年04月20日
    浏览(38)
  • 关于MyBatisPlus框架下出现xml里面定义的方法无法被正确识别以及提示调用mysql存储过程时参数无效的问题

    网上很多解决方法都是查看函数名是否一致、命名空间等,但还有一种可能是你调用接口的模块本身的resource文件夹下就有一个含有xml的mapper文件夹,而这个文件夹里面不含有方法A的sql实现,如下图: 导致程序只在这个mapper里面找A的sql实现,那肯定会提示没有找到。 除了检

    2024年02月09日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包