Mybatis使用OrderItem排序问题

news/2025/2/20 19:24:02/

OrderItem排序失效

  • 1 问题描述
  • 2 orders的工具类
  • 3 达梦数据库的一些学习

1 问题描述

当我们需要根据传入的排序字段进行排序的时候,如果是分页查询可以使用的page的orders(这个不会出现排序失效的问题)
如果我们只是把排序的字段当做一个List<OrderItem> 传入

<if test="orders != null and orders.size > 0">ORDER BY<foreach collection="orders" item="item" separator=",">#{item.column}<if test="item.asc">ASC</if><if test="!item.asc">DESC</if></foreach></if>

因为 #{} 是一个占位符 在sql的时候会加上一个双引号 导致排序失败,可以使用${}

<if test="orders != null and orders.size > 0">ORDER BY<foreach collection="orders" item="item" separator=",">${item.column}<if test="item.asc">ASC</if><if test="!item.asc">DESC</if></foreach></if>

这个他会直接的拼接到sql里边,但是注意sql注入的问题

2 orders的工具类

package com.huadi.res.util;import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huadi.common.utils.CollectionUtilPlus;
import com.huadi.common.utils.StringUtilPlus;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;/*** 转换排序驼峰 yang*/
@Slf4j
public class OrderUtilNew {/*** order by sql的拼接* @param orders 排序的字段* @param tableName 表的别名前缀 拼接到sql里边去的* @return*/public static List<OrderItem> changeHump(List<OrderItem> orders,String tableName) {orders = removeNull(orders);if (CollectionUtilPlus.isEmpty(orders)) {OrderItem orderItem = new OrderItem();orderItem.setColumn("IF(isnull("+tableName+".resource_Sort),1,0),"+tableName+"."+"resource_Sort");orderItem.setAsc(true);orders = new ArrayList<>();orders.add(orderItem);log.info("orders.toString()自定义排序 = {}", orderItem.toString());}//第二排序字段设置为修改时间Set<String> orderSet = orders.stream().map(OrderItem::getColumn).collect(Collectors.toSet());if (!orderSet.contains("updateTime")) {OrderItem orderItem = new OrderItem();orderItem.setColumn("updateTime");orderItem.setAsc(false);orders.add(orderItem);}for (OrderItem order : orders) {if (!order.getColumn().contains("IF(isnull(")) {StringBuilder stringBuilder = new StringBuilder();String column = order.getColumn();for (int i = 0; i < column.length(); i++) {if (column.charAt(i) >= 'A' && column.charAt(i) <= 'Z') {stringBuilder.append("_");}stringBuilder.append(column.charAt(i));}String columnResult = stringBuilder.toString();order.setColumn(tableName+"."+columnResult);}}log.info("orders.toString() = {}", orders.toString());return orders;}private static List<OrderItem> removeNull(List<OrderItem> orders) {if (CollectionUtilPlus.isNotEmpty(orders)) {for (int i = orders.size() - 1; i >= 0; i--) {OrderItem orderItem = orders.get(i);if (orderItem == null) {orders.remove(i);} else if (StringUtilPlus.isBlank(orderItem.getColumn())) {orders.remove(i);}}}return orders;}/*** 校验page参数,如果page不存在,则按照默认分页* @param page 分页参数* @return*/public static Page checkPage(Page page) {if (page == null) {page = new Page<>();page.setCurrent(1L);page.setSize(20L);}return page;}
}

3 达梦数据库的一些学习

有级别关系的数据使用递归查询(适合数据量小的 大数据的没试过 不推荐)

SELECT * FROM  表名  START WITH Id = 2 CONNECT BY PRIOR ID = PARENT_ID

mybatis里边使用like

LIKE CONCAT('%',#{},'%')
LIKE CONCAT(#{},'%')
LIKE CONCAT('%',#{})

http://www.ppmy.cn/news/343441.html

相关文章

安装安卓抓包证书

导出证书.0后缀的文件 将文件放入/system/etc/security/cacerts/目录下&#xff0c;需要挂载读写该文件夹 安装好系统证书后抓包即可

C++ QT MYSQL基操

以下是一个C QT操作MySQL数据库的工具类示例代码&#xff0c;包括连接数据库、创建表、插入数据、删除数据、修改数据、查询数据、查询表字段名称等操作&#xff1a; #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRe…

Android Audio开发——AAudio基础(十五)

AAudio 是一个自 Android O 引入的新的 Android C API。它主要是为需要低延迟的高性能音频应用设计的。应用程序通过直接从流中读取或向流中写入数据来与 AAudio 通信,但它只包含基本的音频输入输出能力。 一、AAudio概述 AAudio 在应用程序和 Android 设备上的音频输入输出之…

object类型(equals、hashCode、getClass、getName)

equals方法的改写 Override//重写equals方法&#xff0c;重写方法后对比的属性值&#xff08;没有重写前对比的是属性值&#xff09;public boolean equals(Object obj) {Students s (Students) obj;return this.name.equals(s.name) && this.age s.age;}public clas…

一文读懂redis持久化机制

持久化官网相关参考资料 https://redis.io/docs/manual/persistence/ 持久化就是把redis内存里面保存的数据保存磁盘中&#xff0c;在redis重启或者能够使得数据不会丢失。目前常用的持久化方式有&#xff1a;RDB方式、AOF方式以及RDB AOF两种方式 RDB持久化方式 所谓的RDB…

柔性机械臂的振动测量和控制研究进展综述

摘要: 柔性机械臂通常具有柔性关节和/或连杆.在过去的40多年里,柔性机械臂的研究取得了长足的进展.本文综述了柔性机械臂在动力学建模方法、振动的传感器测量系统和控制算法研究方面的发展现状、研究热点和前沿进展.首先,简要说明了柔性机械臂的优缺点和复杂性,介绍了柔性关…

多功能推拉力测试机试验为芯片的品质和性能评估提供科学依据

半导体芯片是一种集成电路&#xff0c;由多个晶体管、电容器、电阻器等电子元件组成&#xff0c;通过微电子技术制造而成。它具有体积小、功耗低、速度快、可靠性高等优点&#xff0c;是现代电子产品的核心部件之一。半导体芯片的制造过程非常复杂&#xff0c;包括晶圆制备、光…

加速度传感器选型参数

加速度传感器&#xff1a;Acceleration sensor 1.可测加速度范围&#xff1a; ①紧急制动减速度 紧急制动时&#xff0c;汽车的最大减速度一般为7.5~8 m/s^2。 ②平均制动减速度或平均加速度 普通情况下&#xff0c;汽车的平均减速度应为3~4 m/s^2。 ③正常制动减速度 实际…