From cd0a3d0f4948bb3395f7b7237850a7057e8f86c3 Mon Sep 17 00:00:00 2001 From: admin <570810310@qq.com> Date: Mon, 22 Mar 2021 10:44:56 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Eselect=E5=88=AB=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alias/AliasLambdaQueryWrapper.java | 64 ++++++++++++++++++- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/yulichang/common/support/alias/AliasLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/common/support/alias/AliasLambdaQueryWrapper.java index 73a704a..f1e0a25 100644 --- a/src/main/java/com/github/yulichang/common/support/alias/AliasLambdaQueryWrapper.java +++ b/src/main/java/com/github/yulichang/common/support/alias/AliasLambdaQueryWrapper.java @@ -1,24 +1,42 @@ package com.github.yulichang.common.support.alias; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; +import com.baomidou.mybatisplus.core.toolkit.Assert; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + /** * 字段添加别名 * 使用方法: *

- * select t.* from table t ${ew.customSqlSegment("t")} + * select ${ew.aliasColumn("table","t")} from table t ${ew.customSqlSegment("t")} + *

+ * 对应sql *

+ * select t.id,t.sex from table t where t.id = ? and t.sex = ? + *

* 注意: - * 官方的自定义sql是ew.customSqlSegment,不带括号,会调用getCustomSqlSegment方法 + * 官方的自定义sql是ew.customSqlSegment,不带括号,会调用getCustomSqlSegment()方法 * 带别名的是 ew.customSqlSegment("t") 带括号 * 括号中的别名必须带双引号 * * @author yulichang */ public class AliasLambdaQueryWrapper extends LambdaQueryWrapper { + + /** + * 别名查询字段缓存 + */ + private static final Map, Map> ALIAS_COLUMN_CACHE = new ConcurrentHashMap<>(); + /** * 字段别名 */ @@ -33,8 +51,50 @@ public class AliasLambdaQueryWrapper extends LambdaQueryWrapper { return StringUtils.isBlank(alias) ? as : (alias + StringPool.DOT + as); } + /** + * ew.customSqlSegment("t") + */ public String customSqlSegment(String alias) { this.alias = alias; return super.getCustomSqlSegment(); } + + /** + * ew.customSqlSegment("table_name", "t") + * + * @param tableName 数据库表名 + * @param alias 别名 + */ + public String aliasColumn(String tableName, String alias) { + TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName); + Assert.notNull(tableInfo, "未找到对应的表 -> %s", tableName); + Assert.isTrue(StringUtils.isNotBlank(alias), "别名不能为空"); + + this.alias = alias; + Map aliasMap = ALIAS_COLUMN_CACHE.get(tableInfo.getEntityType()); + if (CollectionUtils.isEmpty(aliasMap)) { + aliasMap = new ConcurrentHashMap<>(); + String s = concat(tableInfo, alias); + aliasMap.put(alias, s); + ALIAS_COLUMN_CACHE.put(tableInfo.getEntityType(), aliasMap); + return s; + } else { + if (!aliasMap.containsKey(alias)) { + String s = concat(tableInfo, alias); + aliasMap.put(alias, s); + return s; + } else { + return aliasMap.get(alias); + } + } + } + + private String concat(TableInfo tableInfo, String alias) { + String s = tableInfo.getFieldList().stream().map( + i -> alias + StringPool.DOT + i.getColumn()).collect(Collectors.joining(StringPool.COMMA)); + if (tableInfo.havePK()) { + s = alias + StringPool.DOT + tableInfo.getKeyColumn() + StringPool.COMMA + s; + } + return s; + } }