* 获取实体映射表信息
@@ -71,30 +49,6 @@ public class MPJTableInfoHelper {
return TABLE_INFO_CACHE.get(clazz);
}
- /**
- *
* 获取所有实体映射表信息
@@ -106,59 +60,6 @@ public class MPJTableInfoHelper {
return Collections.unmodifiableList(new ArrayList<>(TABLE_INFO_CACHE.values()));
}
- /**
- *
excludePropertyList = excludeProperty != null && excludeProperty.length > 0 ? Arrays.asList(excludeProperty) : Collections.emptyList();
-
- /* 初始化字段相关 */
- initTableFields(clazz, globalConfig, mpjTableInfo, excludePropertyList);
-
- /* 自动构建 resultMap */
- initResultMapIfNeed(tableInfo);
-
- /* 添加缓存 */
- TABLE_INFO_CACHE.put(clazz, mpjTableInfo);
-
- /* 缓存 lambda */
- LambdaUtils.installCache(tableInfo);
-
- /* 初始化映射关系 */
- initMapping(mpjTableInfo);
- return mpjTableInfo;
- }
-
/**
*
* 实体类反射获取表信息【初始化】
@@ -182,204 +83,6 @@ public class MPJTableInfoHelper {
TABLE_INFO_CACHE.put(clazz, mpjTableInfo);
}
- /**
- * 自动构建 resultMap 并注入(如果条件符合的话)
- */
- private static void initResultMapIfNeed(TableInfo tableInfo) {
- if (tableInfo.isAutoInitResultMap() && null == tableInfo.getResultMap()) {
- String id = tableInfo.getCurrentNamespace() + ".mybatis-plus-join_" + tableInfo.getEntityType().getSimpleName();
- tableInfo.setResultMap(id);
- if (tableInfo.getConfiguration().getResultMapNames().contains(id)) {
- tableInfo.getConfiguration().getResultMap(id);
- }
- List resultMappings = new ArrayList<>();
- if (tableInfo.havePK()) {
- ResultMapping idMapping = new ResultMapping.Builder(tableInfo.getConfiguration(), tableInfo.getKeyProperty(),
- tableInfo.getKeyColumn(), tableInfo.getKeyType())
- .flags(Collections.singletonList(ResultFlag.ID)).build();
- resultMappings.add(idMapping);
- }
- if (CollectionUtils.isNotEmpty(tableInfo.getFieldList())) {
- tableInfo.getFieldList().forEach(i -> resultMappings.add(i.getResultMapping(tableInfo.getConfiguration())));
- }
- ResultMap resultMap = new ResultMap.Builder(tableInfo.getConfiguration(), id, tableInfo.getEntityType(),
- resultMappings).build();
- tableInfo.getConfiguration().addResultMap(resultMap);
- }
- }
-
- /**
- *
- * 初始化 表数据库类型,表名,resultMap
- *
- *
- * @param clazz 实体类
- * @param globalConfig 全局配置
- * @param tableInfo 数据库表反射信息
- * @return 需要排除的字段名
- */
- private static String[] initTableName(Class> clazz, GlobalConfig globalConfig, TableInfo tableInfo) {
- /* 数据库全局配置 */
- GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
- TableName table = clazz.getAnnotation(TableName.class);
-
- String tableName = clazz.getSimpleName();
- String tablePrefix = dbConfig.getTablePrefix();
- String schema = dbConfig.getSchema();
- boolean tablePrefixEffect = true;
- String[] excludeProperty = null;
-
- if (table != null) {
- if (StringUtils.isNotBlank(table.value())) {
- tableName = table.value();
- if (StringUtils.isNotBlank(tablePrefix) && !table.keepGlobalPrefix()) {
- tablePrefixEffect = false;
- }
- } else {
- tableName = initTableNameWithDbConfig(tableName, dbConfig);
- }
- if (StringUtils.isNotBlank(table.schema())) {
- schema = table.schema();
- }
- /* 表结果集映射 */
- if (StringUtils.isNotBlank(table.resultMap())) {
- tableInfo.setResultMap(table.resultMap());
- }
- tableInfo.setAutoInitResultMap(table.autoResultMap());
- excludeProperty = table.excludeProperty();
- } else {
- tableName = initTableNameWithDbConfig(tableName, dbConfig);
- }
-
- String targetTableName = tableName;
- if (StringUtils.isNotBlank(tablePrefix) && tablePrefixEffect) {
- targetTableName = tablePrefix + targetTableName;
- }
- if (StringUtils.isNotBlank(schema)) {
- targetTableName = schema + StringPool.DOT + targetTableName;
- }
-
- tableInfo.setTableName(targetTableName);
-
- return excludeProperty;
- }
-
- /**
- * 根据 DbConfig 初始化 表名
- *
- * @param className 类名
- * @param dbConfig DbConfig
- * @return 表名
- */
- private static String initTableNameWithDbConfig(String className, GlobalConfig.DbConfig dbConfig) {
- String tableName = className;
- // 开启表名下划线申明
- if (dbConfig.isTableUnderline()) {
- tableName = StringUtils.camelToUnderline(tableName);
- }
- // 大写命名判断
- if (dbConfig.isCapitalMode()) {
- tableName = tableName.toUpperCase();
- } else {
- // 首字母小写
- tableName = StringUtils.firstToLowerCase(tableName);
- }
- return tableName;
- }
-
- /**
- *
- * 初始化 表主键,表字段
- *
- *
- * @param clazz 实体类
- * @param globalConfig 全局配置
- * @param mpjTableInfo 数据库表反射信息
- */
- private static void initTableFields(Class> clazz, GlobalConfig globalConfig, MPJTableInfo mpjTableInfo, List excludeProperty) {
- /* 数据库全局配置 */
- GlobalConfig.DbConfig dbConfig = globalConfig.getDbConfig();
- ReflectorFactory reflectorFactory = mpjTableInfo.getTableInfo().getConfiguration().getReflectorFactory();
- Reflector reflector = reflectorFactory.findForClass(clazz);
- List list = getAllFields(clazz);
- // 标记是否读取到主键
- boolean isReadPK = false;
- // 是否存在 @TableId 注解
- boolean existTableId = isExistTableId(list);
- // 是否存在 @TableLogic 注解
- boolean existTableLogic = isExistTableLogic(list);
-
- List fieldList = new ArrayList<>(list.size());
- for (Field field : list) {
- if (excludeProperty.contains(field.getName())) {
- continue;
- }
-
- /* 主键ID 初始化 */
- if (existTableId) {
- TableId tableId = field.getAnnotation(TableId.class);
- if (tableId != null) {
- if (isReadPK) {
- throw ExceptionUtils.mpe("@TableId can't more than one in Class: \"%s\".", clazz.getName());
- } else {
- initTableIdWithAnnotation(dbConfig, mpjTableInfo.getTableInfo(), field, tableId, reflector);
- isReadPK = true;
- continue;
- }
- }
- } else if (!isReadPK) {
- isReadPK = initTableIdWithoutAnnotation(dbConfig, mpjTableInfo.getTableInfo(), field, reflector);
- if (isReadPK) {
- continue;
- }
- }
-
- final TableField tableField = field.getAnnotation(TableField.class);
-
- /* 有 @TableField 注解的字段初始化 */
- if (tableField != null) {
- fieldList.add(new TableFieldInfo(dbConfig, mpjTableInfo.getTableInfo(), field, tableField, reflector, existTableLogic));
- continue;
- }
-
- /* 无 @TableField 注解的字段初始化 */
- fieldList.add(new TableFieldInfo(dbConfig, mpjTableInfo.getTableInfo(), field, reflector, existTableLogic));
- }
-
- /* 字段列表 */
- mpjTableInfo.getTableInfo().setFieldList(fieldList);
-
-
- /* 未发现主键注解,提示警告信息 */
- if (!isReadPK) {
- logger.warn(String.format("Can not find table primary key in Class: \"%s\".", clazz.getName()));
- }
- }
-
- /**
- *
- * 判断主键注解是否存在
- *
- *
- * @param list 字段列表
- * @return true 为存在 @TableId 注解;
- */
- public static boolean isExistTableId(List list) {
- return list.stream().anyMatch(field -> field.isAnnotationPresent(TableId.class));
- }
-
- /**
- *
- * 判断逻辑删除注解是否存在
- *
- *
- * @param list 字段列表
- * @return true 为存在 @TableId 注解;
- */
- public static boolean isExistTableLogic(List list) {
- return list.stream().anyMatch(field -> field.isAnnotationPresent(TableLogic.class));
- }
-
private static boolean isExistMapping(Class> clazz) {
return ReflectionKit.getFieldList(ClassUtils.getUserClass(clazz)).stream().anyMatch(field -> field.isAnnotationPresent(EntityMapping.class));
}
@@ -388,137 +91,6 @@ public class MPJTableInfoHelper {
return ReflectionKit.getFieldList(ClassUtils.getUserClass(clazz)).stream().anyMatch(field -> field.isAnnotationPresent(FieldMapping.class));
}
- /**
- *
- * 主键属性初始化
- *
- *
- * @param dbConfig 全局配置信息
- * @param tableInfo 表信息
- * @param field 字段
- * @param tableId 注解
- * @param reflector Reflector
- */
- private static void initTableIdWithAnnotation(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo,
- Field field, TableId tableId, Reflector reflector) {
- boolean underCamel = tableInfo.isUnderCamel();
- final String property = field.getName();
- if (field.getAnnotation(TableField.class) != null) {
- logger.warn(String.format("This \"%s\" is the table primary key by @TableId annotation in Class: \"%s\",So @TableField annotation will not work!",
- property, tableInfo.getEntityType().getName()));
- }
- /* 主键策略( 注解 > 全局 ) */
- // 设置 Sequence 其他策略无效
- if (IdType.NONE == tableId.type()) {
- tableInfo.setIdType(dbConfig.getIdType());
- } else {
- tableInfo.setIdType(tableId.type());
- }
-
- /* 字段 */
- String column = property;
- if (StringUtils.isNotBlank(tableId.value())) {
- column = tableId.value();
- } else {
- // 开启字段下划线申明
- if (underCamel) {
- column = StringUtils.camelToUnderline(column);
- }
- // 全局大写命名
- if (dbConfig.isCapitalMode()) {
- column = column.toUpperCase();
- }
- }
- final Class> keyType = reflector.getGetterType(property);
- if (keyType.isPrimitive()) {
- logger.warn(String.format("This primary key of \"%s\" is primitive !不建议如此请使用包装类 in Class: \"%s\"",
- property, tableInfo.getEntityType().getName()));
- }
- tableInfo.setKeyRelated(checkRelated(underCamel, property, column))
- .setKeyColumn(column)
- .setKeyProperty(property)
- .setKeyType(keyType);
- }
-
- /**
- *
- * 主键属性初始化
- *
- *
- * @param tableInfo 表信息
- * @param field 字段
- * @param reflector Reflector
- * @return true 继续下一个属性判断,返回 continue;
- */
- private static boolean initTableIdWithoutAnnotation(GlobalConfig.DbConfig dbConfig, TableInfo tableInfo,
- Field field, Reflector reflector) {
- final String property = field.getName();
- if (DEFAULT_ID_NAME.equalsIgnoreCase(property)) {
- if (field.getAnnotation(TableField.class) != null) {
- logger.warn(String.format("This \"%s\" is the table primary key by default name for `id` in Class: \"%s\",So @TableField will not work!",
- property, tableInfo.getEntityType().getName()));
- }
- String column = property;
- if (dbConfig.isCapitalMode()) {
- column = column.toUpperCase();
- }
- final Class> keyType = reflector.getGetterType(property);
- if (keyType.isPrimitive()) {
- logger.warn(String.format("This primary key of \"%s\" is primitive !不建议如此请使用包装类 in Class: \"%s\"",
- property, tableInfo.getEntityType().getName()));
- }
- tableInfo.setKeyRelated(checkRelated(tableInfo.isUnderCamel(), property, column))
- .setIdType(dbConfig.getIdType())
- .setKeyColumn(column)
- .setKeyProperty(property)
- .setKeyType(keyType);
- return true;
- }
- return false;
- }
-
- /**
- * 判定 related 的值
- *
- * 为 true 表示不符合规则
- *
- * @param underCamel 驼峰命名
- * @param property 属性名
- * @param column 字段名
- * @return related
- */
- public static boolean checkRelated(boolean underCamel, String property, String column) {
- column = StringUtils.getTargetColumn(column);
- String propertyUpper = property.toUpperCase(Locale.ENGLISH);
- String columnUpper = column.toUpperCase(Locale.ENGLISH);
- if (underCamel) {
- // 开启了驼峰并且 column 包含下划线
- return !(propertyUpper.equals(columnUpper) ||
- propertyUpper.equals(columnUpper.replace(StringPool.UNDERSCORE, StringPool.EMPTY)));
- } else {
- // 未开启驼峰,直接判断 property 是否与 column 相同(全大写)
- return !propertyUpper.equals(columnUpper);
- }
- }
-
- /**
- *
- * 获取该类的所有属性列表
- *
- *
- * @param clazz 反射类
- * @return 属性集合
- */
- public static List getAllFields(Class> clazz) {
- List fieldList = ReflectionKit.getFieldList(ClassUtils.getUserClass(clazz));
- return fieldList.stream()
- .filter(field -> {
- /* 过滤注解非表字段属性 */
- TableField tableField = field.getAnnotation(TableField.class);
- return (tableField == null || tableField.exist());
- }).collect(toList());
- }
-
/**
* 初始化映射相关
*/
@@ -531,19 +103,19 @@ public class MPJTableInfoHelper {
mpjTableInfo.setHasMappingField(existMappingField);
mpjTableInfo.setHasMappingOrField(existMapping || existMappingField);
/* 关系映射初始化 */
- List mpjFieldList = new ArrayList<>();
+ List mpjFieldList = new ArrayList<>();
List fields = ReflectionKit.getFieldList(ClassUtils.getUserClass(mpjTableInfo.getTableInfo().getEntityType()));
for (Field field : fields) {
if (existMapping) {
EntityMapping mapping = field.getAnnotation(EntityMapping.class);
if (mapping != null) {
- mpjFieldList.add(new MPJTableFieldInfo(mpjTableInfo.getTableInfo().getEntityType(), mapping, field));
+ mpjFieldList.add(new com.github.yulichang.mapper.MPJTableFieldInfo(mpjTableInfo.getTableInfo().getEntityType(), mapping, field));
}
}
if (existMappingField) {
FieldMapping mapping = field.getAnnotation(FieldMapping.class);
if (mapping != null) {
- mpjFieldList.add(new MPJTableFieldInfo(mpjTableInfo.getTableInfo().getEntityType(), mapping, field));
+ mpjFieldList.add(new com.github.yulichang.mapper.MPJTableFieldInfo(mpjTableInfo.getTableInfo().getEntityType(), mapping, field));
}
}
}
diff --git a/src/main/java/com/github/yulichang/base/mapper/MPJDeepMapper.java b/src/main/java/com/github/yulichang/base/mapper/MPJDeepMapper.java
index b954e34..95ebdc8 100644
--- a/src/main/java/com/github/yulichang/base/mapper/MPJDeepMapper.java
+++ b/src/main/java/com/github/yulichang/base/mapper/MPJDeepMapper.java
@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.metadata.*;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.github.yulichang.base.mapper.wrapper.MappingQuery;
+import com.github.yulichang.mapper.MPJTableFieldInfo;
+import com.github.yulichang.mapper.MPJTableInfo;
import com.github.yulichang.toolkit.LambdaUtils;
import java.io.Serializable;
diff --git a/src/main/java/com/github/yulichang/base/mapper/wrapper/MappingQuery.java b/src/main/java/com/github/yulichang/base/mapper/wrapper/MappingQuery.java
index f1fe098..1568b6a 100644
--- a/src/main/java/com/github/yulichang/base/mapper/wrapper/MappingQuery.java
+++ b/src/main/java/com/github/yulichang/base/mapper/wrapper/MappingQuery.java
@@ -3,8 +3,8 @@ package com.github.yulichang.base.mapper.wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.enums.SqlKeyword;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.MPJMappingWrapper;
-import com.baomidou.mybatisplus.core.metadata.MPJTableFieldInfo;
+import com.github.yulichang.mapper.MPJMappingWrapper;
+import com.github.yulichang.mapper.MPJTableFieldInfo;
import java.util.List;
diff --git a/src/main/java/com/github/yulichang/config/MappingConfig.java b/src/main/java/com/github/yulichang/config/MappingConfig.java
index 4a44451..ee07913 100644
--- a/src/main/java/com/github/yulichang/config/MappingConfig.java
+++ b/src/main/java/com/github/yulichang/config/MappingConfig.java
@@ -1,7 +1,7 @@
package com.github.yulichang.config;
import com.baomidou.mybatisplus.core.metadata.MPJTableInfoHelper;
-import com.baomidou.mybatisplus.core.metadata.MPJTableMapperHelper;
+import com.github.yulichang.mapper.MPJTableMapperHelper;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
diff --git a/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java b/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java
index fdd32b4..3ae1e0f 100644
--- a/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java
+++ b/src/main/java/com/github/yulichang/injector/MPJSqlInjector.java
@@ -15,7 +15,7 @@ import com.baomidou.mybatisplus.core.injector.methods.UpdateById;
import com.baomidou.mybatisplus.core.injector.methods.SelectBatchByIds;
import com.baomidou.mybatisplus.core.injector.methods.SelectByMap;
import com.baomidou.mybatisplus.core.mapper.Mapper;
-import com.baomidou.mybatisplus.core.metadata.MPJTableMapperHelper;
+import com.github.yulichang.mapper.MPJTableMapperHelper;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
import com.github.yulichang.method.*;
diff --git a/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
index 4c5730a..82a4faf 100644
--- a/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
+++ b/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
@@ -1,15 +1,19 @@
package com.github.yulichang.interceptor;
-import com.baomidou.mybatisplus.core.metadata.MPJTableInfo;
-import com.baomidou.mybatisplus.core.metadata.MPJTableInfoHelper;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.yulichang.interfaces.MPJBaseJoin;
import com.github.yulichang.method.MPJResultType;
import com.github.yulichang.toolkit.Constant;
+import com.github.yulichang.toolkit.ReflectionKit;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.github.yulichang.wrapper.SelectColumn;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;
@@ -23,13 +27,17 @@ import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;
-import org.springframework.core.annotation.Order;
+import org.apache.ibatis.type.TypeHandler;
+import org.apache.ibatis.type.TypeHandlerRegistry;
+import org.apache.ibatis.type.UnknownTypeHandler;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
/**
* 连表拦截器
@@ -43,11 +51,10 @@ import java.util.concurrent.ConcurrentHashMap;
public class MPJInterceptor implements Interceptor {
private static final Log logger = LogFactory.getLog(MPJInterceptor.class);
-
private static final List EMPTY_RESULT_MAPPING = new ArrayList<>(0);
/**
- * 缓存MappedStatement,不需要每次都去重写构建MappedStatement
+ * 缓存MappedStatement,不需要每次都去重新构建MappedStatement
*/
private static final Map> MS_CACHE = new ConcurrentHashMap<>();
@@ -72,7 +79,7 @@ public class MPJInterceptor implements Interceptor {
if (CollectionUtils.isNotEmpty(list)) {
ResultMap resultMap = list.get(0);
if (resultMap.getType() == MPJResultType.class) {
- args[0] = newMappedStatement(ms, clazz);
+ args[0] = getMappedStatement(ms, clazz, ew);
}
}
}
@@ -84,10 +91,16 @@ public class MPJInterceptor implements Interceptor {
/**
- * 构建新的MappedStatement
+ * 获取MappedStatement
*/
- public MappedStatement newMappedStatement(MappedStatement ms, Class> resultType) {
+ public MappedStatement getMappedStatement(MappedStatement ms, Class> resultType, Object ew) {
String id = ms.getId() + StringPool.UNDERSCORE + resultType.getName();
+
+ if (ew instanceof MPJLambdaWrapper) {
+ //不走缓存
+ return buildMappedStatement(ms, resultType, ew, id);
+ }
+ //走缓存
Map statementMap = MS_CACHE.get(id);
if (CollectionUtils.isNotEmpty(statementMap)) {
MappedStatement statement = statementMap.get(ms.getConfiguration());
@@ -95,6 +108,20 @@ public class MPJInterceptor implements Interceptor {
return statement;
}
}
+ MappedStatement mappedStatement = buildMappedStatement(ms, resultType, ew, id);
+ if (statementMap == null) {
+ statementMap = new ConcurrentHashMap<>();
+ MS_CACHE.put(id, statementMap);
+ }
+ statementMap.put(ms.getConfiguration(), mappedStatement);
+ return mappedStatement;
+ }
+
+
+ /**
+ * 构建新的MappedStatement
+ */
+ private MappedStatement buildMappedStatement(MappedStatement ms, Class> resultType, Object ew, String id) {
MappedStatement.Builder builder = new MappedStatement.Builder(ms.getConfiguration(), id, ms.getSqlSource(), ms.getSqlCommandType())
.resource(ms.getResource())
.fetchSize(ms.getFetchSize())
@@ -110,33 +137,90 @@ public class MPJInterceptor implements Interceptor {
builder.keyProperty(String.join(StringPool.COMMA, ms.getKeyProperties()));
}
List resultMaps = new ArrayList<>();
- resultMaps.add(newResultMap(ms, resultType));
+ resultMaps.add(buildResultMap(ms, resultType, ew));
builder.resultMaps(resultMaps);
- MappedStatement mappedStatement = builder.build();
-
- if (statementMap == null) {
- statementMap = new ConcurrentHashMap<>();
- MS_CACHE.put(id, statementMap);
- }
- statementMap.put(ms.getConfiguration(), mappedStatement);
- return mappedStatement;
+ return builder.build();
}
/**
* 构建resultMap
*/
- private ResultMap newResultMap(MappedStatement ms, Class> resultType) {
+ @SuppressWarnings({"rawtypes", "unchecked", "ConstantConditions"})
+ private ResultMap buildResultMap(MappedStatement ms, Class> resultType, Object obj) {
TableInfo tableInfo = TableInfoHelper.getTableInfo(resultType);
- if (tableInfo != null && tableInfo.isAutoInitResultMap() && tableInfo.getEntityType() == resultType) {
- return ms.getConfiguration().getResultMap(tableInfo.getResultMap());
+ if (tableInfo == null || !(obj instanceof MPJLambdaWrapper)) {
+ return getDefaultResultMap(tableInfo, ms, resultType);
}
- MPJTableInfo infoDTO = MPJTableInfoHelper.getTableInfo(resultType);
- if (infoDTO == null) {
- infoDTO = MPJTableInfoHelper.initTableInfo(ms.getConfiguration(),
- ms.getId().substring(0, ms.getId().lastIndexOf(".")), resultType, null);
+ MPJLambdaWrapper wrapper = (MPJLambdaWrapper) obj;
+ String currentNamespace = ms.getResource().split(StringPool.SPACE)[0];
+ String id = currentNamespace + StringPool.DOT + Constants.MYBATIS_PLUS + StringPool.UNDERSCORE + resultType.getSimpleName();
+ if (wrapper.isResultMap()) {
+ //TODO
+ //添加 collection 标签
+ return new ResultMap.Builder(ms.getConfiguration(), ms.getId(), resultType, EMPTY_RESULT_MAPPING).build();
+ } else {
+ List columnList = wrapper.getSelectColumns();
+ List resultMappings = new ArrayList<>();
+ columnList.forEach(i -> {
+ //别名优先
+ if (StringUtils.isNotBlank(i.getAlias())) {
+ resultMappings.add(new ResultMapping.Builder(ms.getConfiguration(), i.getAlias())
+ .column(i.getColumnName()).build());
+ } else if (i.getTableFieldInfo() != null) {
+ //其次field info
+ TableFieldInfo info = i.getTableFieldInfo();
+ if (info.getTypeHandler() != null && info.getTypeHandler() != UnknownTypeHandler.class) {
+ TypeHandlerRegistry registry = ms.getConfiguration().getTypeHandlerRegistry();
+ TypeHandler> typeHandler = registry.getMappingTypeHandler(info.getTypeHandler());
+ if (typeHandler == null) {
+ typeHandler = registry.getInstance(info.getPropertyType(), info.getTypeHandler());
+ }
+ resultMappings.add(new ResultMapping.Builder(ms.getConfiguration(), info.getProperty(),
+ info.getColumn(), info.getPropertyType())
+ .typeHandler(typeHandler).build());
+ } else {
+ resultMappings.add(new ResultMapping.Builder(ms.getConfiguration(), info.getProperty(),
+ info.getColumn(), info.getPropertyType()).build());
+ }
+ } else {
+ //最后取值
+ TableFieldInfo info = tableInfo.getFieldList().stream().filter(t -> t.getColumn().equals(i.getColumnName()))
+ .findFirst().orElseGet(null);
+ if (info != null && Objects.equals(tableInfo.getKeyColumn(), i.getColumnName())) {
+ resultMappings.add(new ResultMapping.Builder(ms.getConfiguration(), tableInfo.getKeyProperty(),
+ tableInfo.getKeyColumn(), tableInfo.getKeyType()).build());
+ } else if (info != null) {
+ resultMappings.add(new ResultMapping.Builder(ms.getConfiguration(), info.getProperty(),
+ info.getColumn(), info.getPropertyType()).build());
+ } else {
+ resultMappings.add(new ResultMapping.Builder(ms.getConfiguration(), i.getColumnName())
+ .column(i.getColumnName()).build());
+ }
+ }
+ });
+ return new ResultMap.Builder(ms.getConfiguration(), id, resultType, resultMappings).build();
}
- if (infoDTO.getTableInfo().isAutoInitResultMap()) {
- return ms.getConfiguration().getResultMap(infoDTO.getTableInfo().getResultMap());
+ }
+
+
+ //TODO 可以加缓存
+ private ResultMap getDefaultResultMap(TableInfo tableInfo, MappedStatement ms, Class> resultType) {
+ if (tableInfo != null && tableInfo.isAutoInitResultMap()) {
+ //补充不全的属性
+ ResultMap resultMap = ms.getConfiguration().getResultMap(tableInfo.getResultMap());
+ List resultMappings = resultMap.getResultMappings();
+ List notExistField = ReflectionKit.getFieldList(resultType).stream().filter(i ->
+ !i.getAnnotation(TableField.class).exist()).collect(Collectors.toList());
+ if (CollectionUtils.isNotEmpty(notExistField)) {
+ //复制已有的resultMapping
+ List resultMappingList = new ArrayList<>(resultMappings);
+ //复制不存在的resultMapping
+ for (Field i : notExistField) {
+ resultMappingList.add(new ResultMapping.Builder(ms.getConfiguration(),
+ i.getName(), i.getName(), i.getType()).build());
+ }
+ return new ResultMap.Builder(ms.getConfiguration(), ms.getId(), resultType, resultMappingList).build();
+ }
}
return new ResultMap.Builder(ms.getConfiguration(), ms.getId(), resultType, EMPTY_RESULT_MAPPING).build();
}
diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJMappingWrapper.java b/src/main/java/com/github/yulichang/mapper/MPJMappingWrapper.java
similarity index 98%
rename from src/main/java/com/baomidou/mybatisplus/core/metadata/MPJMappingWrapper.java
rename to src/main/java/com/github/yulichang/mapper/MPJMappingWrapper.java
index cb029ac..173acee 100644
--- a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJMappingWrapper.java
+++ b/src/main/java/com/github/yulichang/mapper/MPJMappingWrapper.java
@@ -1,4 +1,4 @@
-package com.baomidou.mybatisplus.core.metadata;
+package com.github.yulichang.mapper;
import com.baomidou.mybatisplus.core.enums.SqlKeyword;
diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableFieldInfo.java b/src/main/java/com/github/yulichang/mapper/MPJTableFieldInfo.java
similarity index 98%
rename from src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableFieldInfo.java
rename to src/main/java/com/github/yulichang/mapper/MPJTableFieldInfo.java
index 1cb542a..dfef2dd 100644
--- a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableFieldInfo.java
+++ b/src/main/java/com/github/yulichang/mapper/MPJTableFieldInfo.java
@@ -1,6 +1,10 @@
-package com.baomidou.mybatisplus.core.metadata;
+package com.github.yulichang.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.MPJTableInfoHelper;
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.*;
import com.github.yulichang.annotation.EntityMapping;
import com.github.yulichang.annotation.FieldMapping;
@@ -22,7 +26,6 @@ import java.util.Map;
* 字段属性
*
* @author yulichang
- * @see TableFieldInfo
* @since 1.2.0
*/
@Getter
diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableInfo.java b/src/main/java/com/github/yulichang/mapper/MPJTableInfo.java
similarity index 86%
rename from src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableInfo.java
rename to src/main/java/com/github/yulichang/mapper/MPJTableInfo.java
index 5cfff19..7a54958 100644
--- a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableInfo.java
+++ b/src/main/java/com/github/yulichang/mapper/MPJTableInfo.java
@@ -1,8 +1,7 @@
-package com.baomidou.mybatisplus.core.metadata;
+package com.github.yulichang.mapper;
-import lombok.AccessLevel;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
import lombok.Data;
-import lombok.Setter;
import lombok.experimental.Accessors;
import java.util.List;
@@ -15,7 +14,6 @@ import java.util.List;
* @since 1.2.0
*/
@Data
-@Setter(AccessLevel.PACKAGE)
@Accessors(chain = true)
public class MPJTableInfo {
diff --git a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java b/src/main/java/com/github/yulichang/mapper/MPJTableMapperHelper.java
similarity index 90%
rename from src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java
rename to src/main/java/com/github/yulichang/mapper/MPJTableMapperHelper.java
index a7469d5..450343f 100644
--- a/src/main/java/com/baomidou/mybatisplus/core/metadata/MPJTableMapperHelper.java
+++ b/src/main/java/com/github/yulichang/mapper/MPJTableMapperHelper.java
@@ -1,4 +1,4 @@
-package com.baomidou.mybatisplus.core.metadata;
+package com.github.yulichang.mapper;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/com/github/yulichang/query/interfaces/MPJJoin.java b/src/main/java/com/github/yulichang/query/interfaces/MPJJoin.java
index 02138c0..35f11c4 100644
--- a/src/main/java/com/github/yulichang/query/interfaces/MPJJoin.java
+++ b/src/main/java/com/github/yulichang/query/interfaces/MPJJoin.java
@@ -9,6 +9,9 @@ import com.github.yulichang.toolkit.Constant;
@SuppressWarnings("unused")
public interface MPJJoin extends MPJBaseJoin {
+ /**
+ * left join
+ */
default Children leftJoin(String joinSql) {
return leftJoin(true, joinSql);
}
@@ -17,6 +20,10 @@ public interface MPJJoin extends MPJBaseJoin {
return join(Constant.LEFT_JOIN, condition, joinSql);
}
+
+ /**
+ * right join
+ */
default Children rightJoin(String joinSql) {
return rightJoin(true, joinSql);
}
@@ -25,6 +32,10 @@ public interface MPJJoin extends MPJBaseJoin {
return join(Constant.RIGHT_JOIN, condition, joinSql);
}
+
+ /**
+ * inner join
+ */
default Children innerJoin(String joinSql) {
return innerJoin(true, joinSql);
}
@@ -33,5 +44,16 @@ public interface MPJJoin extends MPJBaseJoin {
return join(Constant.INNER_JOIN, condition, joinSql);
}
+ /**
+ * full join
+ */
+ default Children fullJoin(String joinSql) {
+ return fullJoin(true, joinSql);
+ }
+
+ default Children fullJoin(boolean condition, String joinSql) {
+ return join(Constant.FULL_JOIN, condition, joinSql);
+ }
+
Children join(String keyWord, boolean condition, String joinSql);
}
diff --git a/src/main/java/com/github/yulichang/toolkit/CacheList.java b/src/main/java/com/github/yulichang/toolkit/CacheList.java
new file mode 100644
index 0000000..e1ab861
--- /dev/null
+++ b/src/main/java/com/github/yulichang/toolkit/CacheList.java
@@ -0,0 +1,71 @@
+package com.github.yulichang.toolkit;
+
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * 查询字段集合
+ *
+ * @author yulichang
+ * @since 1.2.5
+ */
+public class CacheList extends ArrayList implements UniqueObject {
+
+ private String uniqueKey;
+
+ @Override
+ public String getUniqueKey() {
+ if (StringUtils.isBlank(uniqueKey)) {
+ StringBuilder sb = new StringBuilder();
+ for (UniqueObject ub : this) {
+ sb.append(ub.getUniqueKey());
+ }
+ this.uniqueKey = sb.toString();
+ }
+ return this.uniqueKey;
+ }
+
+ @Override
+ public boolean add(T t) {
+ this.uniqueKey = null;
+ return super.add(t);
+ }
+
+ @Override
+ public boolean remove(Object o) {
+ this.uniqueKey = null;
+ return super.remove(o);
+ }
+
+ @Override
+ public boolean addAll(Collection extends T> c) {
+ this.uniqueKey = null;
+ return super.addAll(c);
+ }
+
+ @Override
+ public boolean addAll(int index, Collection extends T> c) {
+ this.uniqueKey = null;
+ return super.addAll(index, c);
+ }
+
+ @Override
+ public boolean removeAll(Collection> c) {
+ this.uniqueKey = null;
+ return super.removeAll(c);
+ }
+
+ @Override
+ protected void removeRange(int fromIndex, int toIndex) {
+ this.uniqueKey = null;
+ super.removeRange(fromIndex, toIndex);
+ }
+
+ @Override
+ public void clear() {
+ this.uniqueKey = null;
+ super.clear();
+ }
+}
diff --git a/src/main/java/com/github/yulichang/toolkit/Constant.java b/src/main/java/com/github/yulichang/toolkit/Constant.java
index e6ee5c2..c71a8d3 100644
--- a/src/main/java/com/github/yulichang/toolkit/Constant.java
+++ b/src/main/java/com/github/yulichang/toolkit/Constant.java
@@ -23,6 +23,8 @@ public interface Constant {
String INNER = "INNER";
+ String FULL = "FULL";
+
String CLAZZ = "resultTypeClass_Eg1sG";
String PARAM_TYPE = "paramType_Gr8re1Ee";
@@ -42,6 +44,11 @@ public interface Constant {
*/
String INNER_JOIN = StringPool.SPACE + INNER + StringPool.SPACE + JOIN + StringPool.SPACE;
+ /**
+ * " FULL JOIN "
+ */
+ String FULL_JOIN = StringPool.SPACE + FULL + StringPool.SPACE + JOIN + StringPool.SPACE;
+
/**
* " t"
*/
diff --git a/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java b/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java
index 7beb082..a66a235 100644
--- a/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java
+++ b/src/main/java/com/github/yulichang/toolkit/SpringContentUtils.java
@@ -15,6 +15,7 @@ public class SpringContentUtils implements ApplicationContextAware {
private static ApplicationContext context;
@Override
+ @SuppressWarnings("NullableProblems")
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
diff --git a/src/main/java/com/github/yulichang/toolkit/UniqueObject.java b/src/main/java/com/github/yulichang/toolkit/UniqueObject.java
new file mode 100644
index 0000000..bb514ac
--- /dev/null
+++ b/src/main/java/com/github/yulichang/toolkit/UniqueObject.java
@@ -0,0 +1,15 @@
+package com.github.yulichang.toolkit;
+
+/**
+ * 类唯一标识
+ *
+ * @author yulichang
+ * @since 1.2.5
+ */
+public interface UniqueObject {
+
+ /**
+ * 获取类唯一标识
+ */
+ String getUniqueKey();
+}
diff --git a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
index d380d18..d7422fc 100644
--- a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
+++ b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
@@ -5,24 +5,22 @@ import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
-import com.baomidou.mybatisplus.core.toolkit.*;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-import com.github.yulichang.toolkit.Constant;
-import com.github.yulichang.toolkit.LambdaUtils;
-import com.github.yulichang.toolkit.MPJWrappers;
-import com.github.yulichang.toolkit.ReflectionKit;
+import com.github.yulichang.toolkit.*;
import com.github.yulichang.wrapper.enums.BaseFuncEnum;
import com.github.yulichang.wrapper.interfaces.LambdaJoin;
import com.github.yulichang.wrapper.interfaces.Query;
import com.github.yulichang.wrapper.interfaces.on.OnFunction;
-import lombok.Data;
import lombok.Getter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -51,11 +49,8 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper selectColumns = new ArrayList<>();
- /**
- * 忽略查询的字段
- */
- private final List ignoreColumns = new ArrayList<>();
+ @Getter
+ private final List selectColumns = new CacheList<>();
/**
* ON sql wrapper集合
*/
@@ -68,6 +63,11 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper select(SFunction... columns) {
if (ArrayUtils.isNotEmpty(columns)) {
for (SFunction s : columns) {
- selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn()));
+ selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn(), null));
}
}
return typedThis;
@@ -139,7 +139,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper selectColumns.add(SelectColumn.of(entityClass, i.getColumn())));
+ i -> selectColumns.add(SelectColumn.of(entityClass, i.getColumn(), i)));
return typedThis;
}
@@ -150,24 +150,24 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper tagFields = ReflectionKit.getFieldList(tag);
tableInfo.getFieldList().forEach(i -> {
if (tagFields.stream().anyMatch(f -> f.getName().equals(i.getProperty()))) {
- selectColumns.add(SelectColumn.of(source, i.getColumn()));
+ selectColumns.add(SelectColumn.of(source, i.getColumn(), i));
}
});
if (tableInfo.havePK() && tagFields.stream().anyMatch(i -> i.getName().equals(tableInfo.getKeyProperty()))) {
- selectColumns.add(SelectColumn.of(source, tableInfo.getKeyProperty()));
+ selectColumns.add(SelectColumn.of(source, tableInfo.getKeyColumn(), null));
}
return typedThis;
}
@Override
public MPJLambdaWrapper selectAs(SFunction column, String alias) {
- selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias));
+ selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), null, alias));
return typedThis;
}
public MPJLambdaWrapper selectFunc(boolean condition, BaseFuncEnum funcEnum, SFunction column, String alias) {
if (condition) {
- selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias, funcEnum));
+ selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), null, alias, funcEnum));
}
return typedThis;
}
@@ -175,7 +175,7 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper selectFunc(boolean condition, BaseFuncEnum funcEnum, Object column, String alias) {
if (condition) {
- selectColumns.add(SelectColumn.of(null, column.toString(), alias, funcEnum));
+ selectColumns.add(SelectColumn.of(null, column.toString(), null, alias, funcEnum));
}
return typedThis;
}
@@ -184,21 +184,10 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper %s", clazz);
if (info.havePK()) {
- selectColumns.add(SelectColumn.of(clazz, info.getKeyColumn()));
+ selectColumns.add(SelectColumn.of(clazz, info.getKeyColumn(), null));
}
info.getFieldList().forEach(c ->
- selectColumns.add(SelectColumn.of(clazz, c.getColumn())));
- return typedThis;
- }
-
- @Override
- @SafeVarargs
- public final MPJLambdaWrapper selectIgnore(SFunction... columns) {
- if (ArrayUtils.isNotEmpty(columns)) {
- for (SFunction s : columns) {
- ignoreColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn()));
- }
- }
+ selectColumns.add(SelectColumn.of(clazz, c.getColumn(), c)));
return typedThis;
}
@@ -208,10 +197,6 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper c.getFuncEnum() == null && ignoreColumns.stream().anyMatch(i ->
- i.getClazz() == c.getClazz() && Objects.equals(c.getColumnName(), i.getColumnName())));
- }
String s = selectColumns.stream().map(i -> {
String str = Constant.TABLE_ALIAS + getDefault(subTable.get(i.getClazz())) + StringPool.DOT + i.getColumnName();
return (i.getFuncEnum() == null ? str : String.format(i.getFuncEnum().getSql(), str)) +
@@ -272,7 +257,6 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper extends MPJAbstractLambdaWrapper clazz;
-
- /**
- * 数据库字段名
- */
- private String columnName;
-
- /**
- * 字段别名
- */
- private String alias;
-
- /**
- * 字段函数
- */
- private BaseFuncEnum funcEnum;
-
- /**
- * 自定义函数填充参数
- */
- private List> funcArgs;
-
- private SelectColumn(Class> clazz, String columnName, String alias, BaseFuncEnum funcEnum) {
- this.clazz = clazz;
- this.columnName = columnName;
- this.alias = alias;
- this.funcEnum = funcEnum;
- }
-
- public static SelectColumn of(Class> clazz, String columnName) {
- return new SelectColumn(clazz, columnName, null, null);
- }
-
- public static SelectColumn of(Class> clazz, String columnName, String alias) {
- return new SelectColumn(clazz, columnName, alias, null);
- }
-
- public static SelectColumn of(Class> clazz, String columnName, String alias, BaseFuncEnum funcEnum) {
- return new SelectColumn(clazz, columnName, alias, funcEnum);
- }
- }
}
diff --git a/src/main/java/com/github/yulichang/wrapper/SelectColumn.java b/src/main/java/com/github/yulichang/wrapper/SelectColumn.java
new file mode 100644
index 0000000..4db4ef5
--- /dev/null
+++ b/src/main/java/com/github/yulichang/wrapper/SelectColumn.java
@@ -0,0 +1,74 @@
+package com.github.yulichang.wrapper;
+
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.github.yulichang.toolkit.UniqueObject;
+import com.github.yulichang.wrapper.enums.BaseFuncEnum;
+import lombok.Data;
+
+import java.util.Objects;
+
+/**
+ * MPJLambdaWrapper 查询字段
+ *
+ * @author yulichang
+ * @since 1.2.5
+ */
+@Data
+public class SelectColumn implements UniqueObject {
+
+ /**
+ * 字段实体类
+ */
+ private Class> clazz;
+
+ /**
+ * 数据库字段名
+ */
+ private String columnName;
+
+ /**
+ * 字段信息
+ */
+ private TableFieldInfo tableFieldInfo;
+
+ /**
+ * 字段别名
+ */
+ private String alias;
+
+ /**
+ * 字段函数
+ */
+ private BaseFuncEnum funcEnum;
+
+
+ private SelectColumn(Class> clazz, String columnName, TableFieldInfo tableFieldInfo, String alias, BaseFuncEnum funcEnum) {
+ this.clazz = clazz;
+ this.columnName = columnName;
+ this.tableFieldInfo = tableFieldInfo;
+ this.alias = alias;
+ this.funcEnum = funcEnum;
+ }
+
+ public static SelectColumn of(Class> clazz, String columnName, TableFieldInfo tableFieldInfo) {
+ return new SelectColumn(clazz, columnName, tableFieldInfo, null, null);
+ }
+
+ public static SelectColumn of(Class> clazz, String columnName, TableFieldInfo tableFieldInfo, String alias) {
+ return new SelectColumn(clazz, columnName, tableFieldInfo, alias, null);
+ }
+
+ public static SelectColumn of(Class> clazz, String columnName, TableFieldInfo tableFieldInfo, String alias, BaseFuncEnum funcEnum) {
+ return new SelectColumn(clazz, columnName, tableFieldInfo, alias, funcEnum);
+ }
+
+ /**
+ * 获取唯一标识
+ */
+ @Override
+ public String getUniqueKey() {
+ return String.join(StringPool.AMPERSAND, clazz.getName(), columnName, alias,
+ Objects.isNull(funcEnum) ? null : funcEnum.getSql());
+ }
+}
diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java
index ba2d9f4..815c269 100644
--- a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java
+++ b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java
@@ -111,20 +111,6 @@ public interface Query extends Serializable {
return selectFunc(condition, funcEnum, column, LambdaUtils.getName(alias));
}
- /**
- * 忽略查询字段
- *
- * 用法: selectIgnore(UserDO::getId,UserDO::getSex)
- * 注意: 一个selectIgnore只支持一个对象 如果要忽略多个实体的字段,请调用多次
- *
- * .selectIgnore(UserDO::getId,UserDO::getSex)
- * .selectIgnore(UserAddressDO::getArea,UserAddressDO::getCity)
- *
- * @since 1.1.3
- */
- @SuppressWarnings("unchecked")
- Children selectIgnore(SFunction... columns);
-
/**
* 查询实体类全部字段
*/