From 4aa76995d4a6b3e49f10c2fc037cfd04f702c3bc Mon Sep 17 00:00:00 2001 From: farukonfly Date: Mon, 4 Dec 2023 21:45:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:DB2=20V10.5=20=E4=B8=8D=E6=94=AF=E6=8C=81Nu?= =?UTF-8?q?lls=20First|Nulls=20Last=20=E8=AF=AD=E6=B3=95=EF=BC=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E6=8A=8A=E8=AF=A5=E8=AF=AD=E6=B3=95=E9=87=8D=E5=86=99?= =?UTF-8?q?=E4=B8=BAcase=20when=E8=A7=A3=E5=86=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/dialect/impl/DB2105Dialect.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/DB2105Dialect.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/DB2105Dialect.java index 4f9ca73d..71ce16de 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/DB2105Dialect.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/dialect/impl/DB2105Dialect.java @@ -1,7 +1,18 @@ package com.mybatisflex.core.dialect.impl; +import static com.mybatisflex.core.constant.SqlConsts.DELIMITER; +import static com.mybatisflex.core.constant.SqlConsts.NULLS_FIRST; +import static com.mybatisflex.core.constant.SqlConsts.NULLS_LAST; +import static com.mybatisflex.core.constant.SqlConsts.ORDER_BY; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import com.mybatisflex.core.dialect.KeywordWrap; import com.mybatisflex.core.dialect.LimitOffsetProcessor; +import com.mybatisflex.core.query.CPI; +import com.mybatisflex.core.query.QueryOrderBy; +import com.mybatisflex.core.query.QueryTable; +import com.mybatisflex.core.query.QueryWrapper; public class DB2105Dialect extends CommonsDialectImpl { //TODO: 根据DatabaseMetaData获取数据库厂商名和版本号 @@ -13,6 +24,41 @@ public class DB2105Dialect extends CommonsDialectImpl { super(keywordWrap, limitOffsetProcessor); } + @Override + protected void buildOrderBySql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, List queryTables) { + List orderBys = CPI.getOrderBys(queryWrapper); + if (orderBys != null && !orderBys.isEmpty()) { + sqlBuilder.append(ORDER_BY); + int index = 0; + for (QueryOrderBy orderBy : orderBys) { + String orderBySql = orderBy.toSql(queryTables, this); + orderBySql = convertOderbySqlForDB2105(orderBySql); // 转换SQL语句 + sqlBuilder.append(orderBySql); + if (index != orderBys.size() - 1) { + sqlBuilder.append(DELIMITER); + } + index++; + } + } + } + + private String convertOderbySqlForDB2105(String sql) { + Pattern pattern = Pattern.compile("(\\S+)\\s+(\\S+)\\s+("+NULLS_FIRST.trim()+"|"+NULLS_LAST.trim()+")"); + Matcher matcher = pattern.matcher(sql); + if (matcher.find()) { + String column = matcher.group(1); + String orderType = matcher.group(2); + String nullOrder = matcher.group(3); + if (NULLS_FIRST.trim().equals(nullOrder)) { + sql = "CASE WHEN " + column + " IS NULL THEN 0 ELSE 1 END, " + column+" "+orderType; + } else if (NULLS_LAST.trim().equals(nullOrder)) { + sql = "CASE WHEN " + column + " IS NULL THEN 1 ELSE 0 END, " + column+" "+orderType; + } + } + return sql; + } + + public interface DB2105LimitOffsetProcessor { LimitOffsetProcessor DB2105 = (dialect, sql, queryWrapper, limitRows, limitOffset) -> { StringBuilder limitSqlFragment = new StringBuilder(