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('%',#{})