OrderItem排序失效
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('%',#{})