From 02a19ec8a10943b559f9faa3af5c8a0912779063 Mon Sep 17 00:00:00 2001 From: xuejiaming <326308290@qq.com> Date: Mon, 6 Jan 2025 20:00:43 +0800 Subject: [PATCH] =?UTF-8?q?[#277]=20=E6=B7=BB=E5=8A=A0mapping=20strategy?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E7=AD=96=E7=95=A5=E9=80=89=E6=8B=A9=E6=94=AF?= =?UTF-8?q?=E6=8C=81column=E5=92=8Cproperty=E5=92=8Ccolumn+property?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../basic/entity/ColumnEntityMappingRule.java | 26 +++++++++++++ .../core/basic/entity/EntityMappingRule.java | 31 ++++++++++++++++ .../entity/PropertyEntityMappingRule.java | 30 +++++++++++++++ ...TryColumnAndPropertyEntityMappingRule.java | 37 +++++++++++++++++++ .../EasyQueryBuilderConfiguration.java | 4 ++ .../DefaultEasyQueryRuntimeContext.java | 11 +++++- .../context/EmptyQueryRuntimeContext.java | 6 +++ .../core/context/QueryRuntimeContext.java | 2 + .../core/enums/EntityMappingStrategyEnum.java | 13 +++++++ .../builder/impl/AbstractAsSelector.java | 15 +++++--- .../builder/impl/AbstractSelector.java | 9 +++-- .../builder/impl/AutoAsSelectorImpl.java | 17 +++++---- .../sql/builder/ExpressionContext.java | 1 - .../query/core/metadata/EntityMetadata.java | 5 ++- .../com/easy/query/core/util/EasyUtil.java | 14 ++++++- .../query/solon/integration/DbManager.java | 20 ++++++++++ .../integration/SolonEasyQueryProperties.java | 12 ++++++ .../EasyQueryStarterAutoConfiguration.java | 15 ++++++++ .../starter/config/EasyQueryProperties.java | 13 +++++++ .../java/com/easy/query/test/QueryTest.java | 1 + .../java/com/easy/query/test/QueryTest19.java | 4 ++ .../com/easy/query/test/RelationTest.java | 5 ++- .../java/com/easy/query/test/doc/MyUser1.java | 22 +++++++++++ .../easy/query/test/doc/dto/DocUserVO.java | 4 +- .../dto/autodto/SchoolStudentDTOAO111.java | 2 - 25 files changed, 292 insertions(+), 27 deletions(-) create mode 100644 sql-core/src/main/java/com/easy/query/core/basic/entity/ColumnEntityMappingRule.java create mode 100644 sql-core/src/main/java/com/easy/query/core/basic/entity/EntityMappingRule.java create mode 100644 sql-core/src/main/java/com/easy/query/core/basic/entity/PropertyEntityMappingRule.java create mode 100644 sql-core/src/main/java/com/easy/query/core/basic/entity/TryColumnAndPropertyEntityMappingRule.java create mode 100644 sql-core/src/main/java/com/easy/query/core/enums/EntityMappingStrategyEnum.java create mode 100644 sql-test/src/main/java/com/easy/query/test/doc/MyUser1.java diff --git a/sql-core/src/main/java/com/easy/query/core/basic/entity/ColumnEntityMappingRule.java b/sql-core/src/main/java/com/easy/query/core/basic/entity/ColumnEntityMappingRule.java new file mode 100644 index 000000000..21436f5b5 --- /dev/null +++ b/sql-core/src/main/java/com/easy/query/core/basic/entity/ColumnEntityMappingRule.java @@ -0,0 +1,26 @@ +package com.easy.query.core.basic.entity; + +import com.easy.query.core.expression.parser.core.available.TableAvailable; +import com.easy.query.core.expression.segment.SQLEntityAliasSegment; +import com.easy.query.core.metadata.ColumnMetadata; +import com.easy.query.core.metadata.EntityMetadata; +import com.easy.query.core.util.EasyUtil; + +/** + * create time 2025/1/6 19:49 + * 文件说明 + * + * @author xuejiaming + */ +public class ColumnEntityMappingRule implements EntityMappingRule{ + @Override + public ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata) { + String sourceColumnName = sourceColumnMetadata.getName(); + return targetEntityMetadata.getColumnMetadataOrNull(sourceColumnName); + } + + @Override + public String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable) { + return EasyUtil.getAnonymousPropertyNameByAlias(sqlEntityAliasSegment, aliasTable); + } +} diff --git a/sql-core/src/main/java/com/easy/query/core/basic/entity/EntityMappingRule.java b/sql-core/src/main/java/com/easy/query/core/basic/entity/EntityMappingRule.java new file mode 100644 index 000000000..d1def2de0 --- /dev/null +++ b/sql-core/src/main/java/com/easy/query/core/basic/entity/EntityMappingRule.java @@ -0,0 +1,31 @@ +package com.easy.query.core.basic.entity; + +import com.easy.query.core.expression.parser.core.available.TableAvailable; +import com.easy.query.core.expression.segment.SQLEntityAliasSegment; +import com.easy.query.core.metadata.ColumnMetadata; +import com.easy.query.core.metadata.EntityMetadata; + +/** + * create time 2025/1/6 17:18 + * 文件说明 + * + * @author xuejiaming + */ +public interface EntityMappingRule { + /** + * 获取class表别名属性 + * @param sourceEntityMetadata + * @param sourceColumnMetadata + * @param targetEntityMetadata + * @return + */ + ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata); + + /** + * 获取别名表达式表属性名 + * @param sqlEntityAliasSegment + * @param aliasTable + * @return + */ + String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable); +} diff --git a/sql-core/src/main/java/com/easy/query/core/basic/entity/PropertyEntityMappingRule.java b/sql-core/src/main/java/com/easy/query/core/basic/entity/PropertyEntityMappingRule.java new file mode 100644 index 000000000..367973873 --- /dev/null +++ b/sql-core/src/main/java/com/easy/query/core/basic/entity/PropertyEntityMappingRule.java @@ -0,0 +1,30 @@ +package com.easy.query.core.basic.entity; + +import com.easy.query.core.expression.parser.core.available.TableAvailable; +import com.easy.query.core.expression.segment.SQLEntityAliasSegment; +import com.easy.query.core.metadata.ColumnMetadata; +import com.easy.query.core.metadata.EntityMetadata; +import com.easy.query.core.util.EasyUtil; + +/** + * create time 2025/1/6 19:49 + * 文件说明 + * + * @author xuejiaming + */ +public class PropertyEntityMappingRule implements EntityMappingRule{ + @Override + public ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata) { + + ColumnMetadata columnMetadata = targetEntityMetadata.getProperty2ColumnMap().get(sourceColumnMetadata.getPropertyName()); + if (columnMetadata != null && !columnMetadata.isValueObject()) { + return columnMetadata; + } + return null; + } + + @Override + public String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable) { + return EasyUtil.getAnonymousPropertyNameByProperty(sqlEntityAliasSegment, aliasTable); + } +} diff --git a/sql-core/src/main/java/com/easy/query/core/basic/entity/TryColumnAndPropertyEntityMappingRule.java b/sql-core/src/main/java/com/easy/query/core/basic/entity/TryColumnAndPropertyEntityMappingRule.java new file mode 100644 index 000000000..95c7be318 --- /dev/null +++ b/sql-core/src/main/java/com/easy/query/core/basic/entity/TryColumnAndPropertyEntityMappingRule.java @@ -0,0 +1,37 @@ +package com.easy.query.core.basic.entity; + +import com.easy.query.core.expression.parser.core.available.TableAvailable; +import com.easy.query.core.expression.segment.SQLEntityAliasSegment; +import com.easy.query.core.metadata.ColumnMetadata; +import com.easy.query.core.metadata.EntityMetadata; +import com.easy.query.core.util.EasyUtil; + +/** + * create time 2025/1/6 17:21 + * 文件说明 + * + * @author xuejiaming + */ +public class TryColumnAndPropertyEntityMappingRule implements EntityMappingRule { + @Override + public ColumnMetadata getColumnMetadataBySourcColumnMetadata(EntityMetadata sourceEntityMetadata, ColumnMetadata sourceColumnMetadata, EntityMetadata targetEntityMetadata) { + String sourceColumnName = sourceColumnMetadata.getName(); + ColumnMetadata targetColumnMetadata = targetEntityMetadata.getColumnMetadataOrNull(sourceColumnName); + if (targetColumnMetadata == null) { + ColumnMetadata columnMetadata = targetEntityMetadata.getProperty2ColumnMap().get(sourceColumnMetadata.getPropertyName()); + if (columnMetadata != null && !columnMetadata.isValueObject()) { + targetColumnMetadata = columnMetadata; + } + } + return targetColumnMetadata; + } + + @Override + public String getAnonymousPropertyNameFromSQLSegment(SQLEntityAliasSegment sqlEntityAliasSegment, TableAvailable aliasTable) { + String propertyName = EasyUtil.getAnonymousPropertyNameByAlias(sqlEntityAliasSegment, aliasTable); + if (propertyName == null) { + return EasyUtil.getAnonymousPropertyNameByProperty(sqlEntityAliasSegment, aliasTable); + } + return propertyName; + } +} diff --git a/sql-core/src/main/java/com/easy/query/core/bootstrapper/EasyQueryBuilderConfiguration.java b/sql-core/src/main/java/com/easy/query/core/bootstrapper/EasyQueryBuilderConfiguration.java index c636fb4e6..06ac53fb8 100644 --- a/sql-core/src/main/java/com/easy/query/core/bootstrapper/EasyQueryBuilderConfiguration.java +++ b/sql-core/src/main/java/com/easy/query/core/bootstrapper/EasyQueryBuilderConfiguration.java @@ -8,6 +8,9 @@ import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor; import com.easy.query.core.api.dynamic.executor.sort.DefaultObjectSortQueryExecutor; import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor; +import com.easy.query.core.basic.entity.ColumnEntityMappingRule; +import com.easy.query.core.basic.entity.TryColumnAndPropertyEntityMappingRule; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.basic.extension.formater.DefaultSQLParameterPrintFormat; import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat; import com.easy.query.core.basic.extension.listener.EmptyJdbcExecutorListener; @@ -194,6 +197,7 @@ private void defaultConfiguration() { .replaceService(RelationValueFactory.class, DefaultRelationValueFactory.class) .replaceService(PropertyDescriptorMatcher.class, DefaultPropertyDescriptorMatcher.class) .replaceService(ValueFilterFactory.class, AnyValueFilterFactory.class) + .replaceService(EntityMappingRule.class, ColumnEntityMappingRule.class) // .replaceService(NavigateNamedGuess.class, DefaultNavigateNamedGuess.class) .replaceService(EasyQueryClient.class, DefaultEasyQueryClient.class); } diff --git a/sql-core/src/main/java/com/easy/query/core/context/DefaultEasyQueryRuntimeContext.java b/sql-core/src/main/java/com/easy/query/core/context/DefaultEasyQueryRuntimeContext.java index 870c00757..e13a41315 100644 --- a/sql-core/src/main/java/com/easy/query/core/context/DefaultEasyQueryRuntimeContext.java +++ b/sql-core/src/main/java/com/easy/query/core/context/DefaultEasyQueryRuntimeContext.java @@ -5,6 +5,7 @@ import com.easy.query.core.api.SQLClientApiFactory; import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor; import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat; import com.easy.query.core.basic.extension.listener.JdbcExecutorListener; import com.easy.query.core.basic.extension.print.JdbcSQLPrinter; @@ -86,6 +87,7 @@ public class DefaultEasyQueryRuntimeContext implements QueryRuntimeContext { private final MapColumnNameChecker mapColumnNameChecker; private final PropertyDescriptorMatcher propertyDescriptorMatcher; private final ValueFilterFactory valueFilterFactory; + private final EntityMappingRule entityMappingRule; public DefaultEasyQueryRuntimeContext(ServiceProvider serviceProvider, EasyQueryDataSource easyQueryDataSource, @@ -124,7 +126,8 @@ public DefaultEasyQueryRuntimeContext(ServiceProvider serviceProvider, RelationValueFactory relationValueFactory, MapColumnNameChecker mapColumnNameChecker, PropertyDescriptorMatcher propertyDescriptorMatcher, - ValueFilterFactory valueFilterFactory) { + ValueFilterFactory valueFilterFactory, + EntityMappingRule entityMappingRule) { this.serviceProvider = serviceProvider; this.easyQueryDataSource = easyQueryDataSource; this.easyQueryConfiguration = easyQueryConfiguration; @@ -163,6 +166,7 @@ public DefaultEasyQueryRuntimeContext(ServiceProvider serviceProvider, this.mapColumnNameChecker = mapColumnNameChecker; this.propertyDescriptorMatcher = propertyDescriptorMatcher; this.valueFilterFactory = valueFilterFactory; + this.entityMappingRule = entityMappingRule; } @Override @@ -355,4 +359,9 @@ public PropertyDescriptorMatcher getPropertyDescriptorMatcher() { public ValueFilterFactory getValueFilterFactory() { return valueFilterFactory; } + + @Override + public EntityMappingRule getEntityMappingRule() { + return entityMappingRule; + } } diff --git a/sql-core/src/main/java/com/easy/query/core/context/EmptyQueryRuntimeContext.java b/sql-core/src/main/java/com/easy/query/core/context/EmptyQueryRuntimeContext.java index c77806525..c585dea3e 100644 --- a/sql-core/src/main/java/com/easy/query/core/context/EmptyQueryRuntimeContext.java +++ b/sql-core/src/main/java/com/easy/query/core/context/EmptyQueryRuntimeContext.java @@ -3,6 +3,7 @@ import com.easy.query.core.api.SQLClientApiFactory; import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor; import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat; import com.easy.query.core.basic.extension.listener.JdbcExecutorListener; import com.easy.query.core.basic.extension.print.JdbcSQLPrinter; @@ -229,4 +230,9 @@ public PropertyDescriptorMatcher getPropertyDescriptorMatcher() { public ValueFilterFactory getValueFilterFactory() { return null; } + + @Override + public EntityMappingRule getEntityMappingRule() { + return null; + } } diff --git a/sql-core/src/main/java/com/easy/query/core/context/QueryRuntimeContext.java b/sql-core/src/main/java/com/easy/query/core/context/QueryRuntimeContext.java index ff442288d..9e398fe52 100644 --- a/sql-core/src/main/java/com/easy/query/core/context/QueryRuntimeContext.java +++ b/sql-core/src/main/java/com/easy/query/core/context/QueryRuntimeContext.java @@ -3,6 +3,7 @@ import com.easy.query.core.api.SQLClientApiFactory; import com.easy.query.core.api.dynamic.executor.query.WhereObjectQueryExecutor; import com.easy.query.core.api.dynamic.executor.sort.ObjectSortQueryExecutor; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat; import com.easy.query.core.basic.extension.listener.JdbcExecutorListener; import com.easy.query.core.basic.extension.print.JdbcSQLPrinter; @@ -88,4 +89,5 @@ public interface QueryRuntimeContext { MapColumnNameChecker getMapColumnNameChecker(); PropertyDescriptorMatcher getPropertyDescriptorMatcher(); ValueFilterFactory getValueFilterFactory(); + EntityMappingRule getEntityMappingRule(); } diff --git a/sql-core/src/main/java/com/easy/query/core/enums/EntityMappingStrategyEnum.java b/sql-core/src/main/java/com/easy/query/core/enums/EntityMappingStrategyEnum.java new file mode 100644 index 000000000..241ab326c --- /dev/null +++ b/sql-core/src/main/java/com/easy/query/core/enums/EntityMappingStrategyEnum.java @@ -0,0 +1,13 @@ +package com.easy.query.core.enums; + +/** + * create time 2025/1/6 19:51 + * 对象映射策略 + * + * @author xuejiaming + */ +public enum EntityMappingStrategyEnum { + COLUMN_ONLY, + PROPERTY_ONLY, + COLUMN_AND_PROPERTY; +} diff --git a/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractAsSelector.java b/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractAsSelector.java index ac01b4bc9..5be8181a9 100644 --- a/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractAsSelector.java +++ b/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractAsSelector.java @@ -1,6 +1,8 @@ package com.easy.query.core.expression.builder.impl; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.basic.jdbc.executor.internal.enumerable.PartitionResult; +import com.easy.query.core.enums.EntityMetadataTypeEnum; import com.easy.query.core.exception.EasyQueryException; import com.easy.query.core.expression.segment.ColumnSegment; import com.easy.query.core.expression.segment.SQLEntityAliasSegment; @@ -11,7 +13,6 @@ import com.easy.query.core.metadata.EntityMetadata; import com.easy.query.core.util.EasyClassUtil; import com.easy.query.core.util.EasySQLSegmentUtil; -import com.easy.query.core.util.EasyUtil; import java.util.List; @@ -33,25 +34,29 @@ public AbstractAsSelector(EntityQueryExpressionBuilder entityQueryExpressionBuil @Override protected TChain columnAnonymousAll(AnonymousEntityTableExpressionBuilder table) { - if(PartitionResult.class.isAssignableFrom(resultEntityMetadata.getEntityClass())){ + if (PartitionResult.class.isAssignableFrom(resultEntityMetadata.getEntityClass())) { return super.columnAnonymousAll(table); - }else{ + } else { EntityQueryExpressionBuilder queryExpressionBuilder = getAnonymousTableQueryExpressionBuilder(table); if (EasySQLSegmentUtil.isNotEmpty(queryExpressionBuilder.getProjects())) { List sqlSegments = queryExpressionBuilder.getProjects().getSQLSegments(); + EntityMappingRule entityMappingRule = runtimeContext.getEntityMappingRule(); //匿名表内部设定的不查询 for (SQLSegment sqlSegment : sqlSegments) { if (sqlSegment instanceof SQLEntityAliasSegment) { SQLEntityAliasSegment sqlEntityAliasSegment = (SQLEntityAliasSegment) sqlSegment; - String propertyName = EasyUtil.getAnonymousPropertyName(sqlEntityAliasSegment, table.getEntityTable()); + String propertyName = entityMappingRule.getAnonymousPropertyNameFromSQLSegment(sqlEntityAliasSegment, table.getEntityTable()); if (propertyName != null) { - if(resultEntityMetadata.getColumnOrNull(propertyName)!=null){ + if (resultEntityMetadata.getColumnOrNull(propertyName) != null) { ColumnSegment columnSegment = sqlSegmentFactory.createSelectColumnSegment(table.getEntityTable(), propertyName, expressionContext, sqlEntityAliasSegment.getAlias()); sqlBuilderSegment.append(columnSegment); + } else if (resultEntityMetadata.getEntityMetadataType() == EntityMetadataTypeEnum.MAP) { + ColumnSegment columnSegment = sqlSegmentFactory.createAnonymousColumnSegment(table.getEntityTable(), expressionContext, sqlEntityAliasSegment.getAlias()); + sqlBuilderSegment.append(columnSegment); } } else { ColumnSegment columnSegment = sqlSegmentFactory.createAnonymousColumnSegment(table.getEntityTable(), expressionContext, sqlEntityAliasSegment.getAlias()); diff --git a/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractSelector.java b/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractSelector.java index d934e743e..5852b1787 100644 --- a/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractSelector.java +++ b/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AbstractSelector.java @@ -1,5 +1,6 @@ package com.easy.query.core.expression.builder.impl; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.context.QueryRuntimeContext; import com.easy.query.core.enums.EasyBehaviorEnum; import com.easy.query.core.exception.EasyQueryException; @@ -32,15 +33,12 @@ import com.easy.query.core.util.EasyCollectionUtil; import com.easy.query.core.util.EasyRelationalUtil; import com.easy.query.core.util.EasySQLSegmentUtil; -import com.easy.query.core.util.EasyUtil; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * create time 2023/6/22 21:14 @@ -310,13 +308,15 @@ protected TChain columnAnonymousAll(AnonymousEntityTableExpressionBuilder table) if (EasySQLSegmentUtil.isNotEmpty(queryExpressionBuilder.getProjects())) { List sqlSegments = queryExpressionBuilder.getProjects().getSQLSegments(); + + EntityMappingRule entityMappingRule = runtimeContext.getEntityMappingRule(); //匿名表内部设定的不查询 for (SQLSegment sqlSegment : sqlSegments) { if (sqlSegment instanceof SQLEntityAliasSegment) { SQLEntityAliasSegment sqlEntityAliasSegment = (SQLEntityAliasSegment) sqlSegment; - String propertyName = EasyUtil.getAnonymousPropertyName(sqlEntityAliasSegment, table.getEntityTable()); + String propertyName = entityMappingRule.getAnonymousPropertyNameFromSQLSegment(sqlEntityAliasSegment, table.getEntityTable()); if (propertyName != null) { ColumnSegment columnSegment = sqlSegmentFactory.createSelectColumnSegment(table.getEntityTable(), propertyName, expressionContext, sqlEntityAliasSegment.getAlias()); sqlBuilderSegment.append(columnSegment); @@ -324,6 +324,7 @@ protected TChain columnAnonymousAll(AnonymousEntityTableExpressionBuilder table) ColumnSegment columnSegment = sqlSegmentFactory.createAnonymousColumnSegment(table.getEntityTable(), expressionContext, sqlEntityAliasSegment.getAlias()); sqlBuilderSegment.append(columnSegment); } + } else { throw new EasyQueryException("columnAnonymousAll not found column:" + EasyClassUtil.getInstanceSimpleName(sqlSegment)); } diff --git a/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AutoAsSelectorImpl.java b/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AutoAsSelectorImpl.java index 6be7b6bb3..27f10c66c 100644 --- a/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AutoAsSelectorImpl.java +++ b/sql-core/src/main/java/com/easy/query/core/expression/builder/impl/AutoAsSelectorImpl.java @@ -1,6 +1,7 @@ package com.easy.query.core.expression.builder.impl; import com.easy.query.core.basic.api.select.Query; +import com.easy.query.core.basic.entity.EntityMappingRule; import com.easy.query.core.context.QueryRuntimeContext; import com.easy.query.core.enums.EasyBehaviorEnum; import com.easy.query.core.expression.builder.AsSelector; @@ -32,12 +33,12 @@ * * @author xuejiaming */ -public class AutoAsSelectorImpl extends AbstractAsSelector implements AsSelector { +public class AutoAsSelectorImpl extends AbstractAsSelector implements AsSelector { private final EntityQueryExpressionBuilder entityQueryExpressionBuilder; public AutoAsSelectorImpl(EntityQueryExpressionBuilder entityQueryExpressionBuilder, SQLBuilderSegment sqlBuilderSegment, EntityMetadata resultEntityMetadata) { - super(entityQueryExpressionBuilder, sqlBuilderSegment,resultEntityMetadata); + super(entityQueryExpressionBuilder, sqlBuilderSegment, resultEntityMetadata); this.entityQueryExpressionBuilder = entityQueryExpressionBuilder; } @@ -125,6 +126,7 @@ private AsSelector columnAll0(EntityTableExpressionBuilder tableExpressionBuilde EntityMetadata sourceEntityMetadata = tableExpressionBuilder.getEntityMetadata(); Collection sourceProperties = sourceEntityMetadata.getProperties(); + EntityMappingRule entityMappingRule = runtimeContext.getEntityMappingRule(); for (String property : sourceProperties) { ColumnMetadata sourceColumnMetadata = sourceEntityMetadata.getColumnNotNull(property); @@ -132,25 +134,24 @@ private AsSelector columnAll0(EntityTableExpressionBuilder tableExpressionBuilde // continue; // } - if(ignoreColumnIfLargeNotQuery(queryLargeColumn,sourceColumnMetadata)){ + if (ignoreColumnIfLargeNotQuery(queryLargeColumn, sourceColumnMetadata)) { continue; } - String sourceColumnName = sourceColumnMetadata.getName(); - ColumnMetadata targetColumnMetadata = targetEntityMetadata.getColumnMetadataOrNull(sourceColumnName); + ColumnMetadata targetColumnMetadata = entityMappingRule.getColumnMetadataBySourcColumnMetadata(sourceEntityMetadata, sourceColumnMetadata, targetEntityMetadata); if (targetColumnMetadata != null) { - if(ignoreColumnIfLargeNotQuery(queryLargeColumn,targetColumnMetadata)){ + if (ignoreColumnIfLargeNotQuery(queryLargeColumn, targetColumnMetadata)) { continue; } String targetColumnName = targetColumnMetadata.getName(); //如果当前属性和查询对象属性一致那么就返回对应的列名,对应的列名如果不一样就返回对应返回结果对象的属性上的列名 - String alias = Objects.equals(sourceColumnName, targetColumnName) ? null : targetColumnName; + String alias = Objects.equals(sourceColumnMetadata.getName(), targetColumnName) ? null : targetColumnName; ColumnSegment columnSegment = sqlSegmentFactory.createSelectColumnSegment(tableExpressionBuilder.getEntityTable(), sourceColumnMetadata, entityQueryExpressionBuilder.getExpressionContext(), alias); sqlBuilderSegment.append(columnSegment); } } - autoColumnInclude(tableExpressionBuilder.getEntityTable(),targetEntityMetadata); + autoColumnInclude(tableExpressionBuilder.getEntityTable(), targetEntityMetadata); } return this; } diff --git a/sql-core/src/main/java/com/easy/query/core/expression/sql/builder/ExpressionContext.java b/sql-core/src/main/java/com/easy/query/core/expression/sql/builder/ExpressionContext.java index 75eb31c6a..6c5f3f748 100644 --- a/sql-core/src/main/java/com/easy/query/core/expression/sql/builder/ExpressionContext.java +++ b/sql-core/src/main/java/com/easy/query/core/expression/sql/builder/ExpressionContext.java @@ -115,5 +115,4 @@ default boolean hasForEach(){ Boolean getPrintNavSQL(); void setPrintNavSQL(Boolean printSQL); - } diff --git a/sql-core/src/main/java/com/easy/query/core/metadata/EntityMetadata.java b/sql-core/src/main/java/com/easy/query/core/metadata/EntityMetadata.java index e1ac1c292..7b0d57cfc 100644 --- a/sql-core/src/main/java/com/easy/query/core/metadata/EntityMetadata.java +++ b/sql-core/src/main/java/com/easy/query/core/metadata/EntityMetadata.java @@ -146,7 +146,7 @@ public boolean isMultiDataSourceMapping() { private final Set shardingTablePropertyNames = new LinkedHashSet<>(); private ShardingInitConfig shardingInitConfig; private boolean hasValueObject; -// private boolean aliasQuery; + // private boolean aliasQuery; private boolean hasPrimaryKeyGenerator = false; /** @@ -222,6 +222,7 @@ public void init(ServiceProvider serviceProvider) { } } } + EasyAssertMessage easyAssertMessage = EasyClassUtil.getAnnotation(entityClass, EasyAssertMessage.class); if (easyAssertMessage != null) { this.errorMessage = new ErrorMessage(easyAssertMessage.value()); @@ -1172,4 +1173,4 @@ public boolean isHasValueObject() { public boolean isHasPrimaryKeyGenerator() { return hasPrimaryKeyGenerator; } -} +} \ No newline at end of file diff --git a/sql-core/src/main/java/com/easy/query/core/util/EasyUtil.java b/sql-core/src/main/java/com/easy/query/core/util/EasyUtil.java index 39c3ad0d5..217db8499 100644 --- a/sql-core/src/main/java/com/easy/query/core/util/EasyUtil.java +++ b/sql-core/src/main/java/com/easy/query/core/util/EasyUtil.java @@ -8,6 +8,7 @@ import com.easy.query.core.expression.segment.SQLEntityAliasSegment; import com.easy.query.core.expression.sql.builder.EntityQueryExpressionBuilder; import com.easy.query.core.expression.sql.builder.EntityTableExpressionBuilder; +import com.easy.query.core.metadata.ColumnMetadata; import java.time.DayOfWeek; import java.time.LocalDate; @@ -62,7 +63,7 @@ public static int getNextTableIndex(EntityQueryExpressionBuilder sqlEntityExpres return sqlEntityExpression.getTables().size(); } - public static String getAnonymousPropertyName(SQLEntityAliasSegment sqlEntityProject, TableAvailable anonymousTable) { + public static String getAnonymousPropertyNameByAlias(SQLEntityAliasSegment sqlEntityProject, TableAvailable anonymousTable) { String alias = sqlEntityProject.getAlias(); if (EasyStringUtil.isBlank(alias)) { if (sqlEntityProject.getPropertyName() == null) { @@ -73,6 +74,17 @@ public static String getAnonymousPropertyName(SQLEntityAliasSegment sqlEntityPro return anonymousTable.getEntityMetadata().getPropertyNameOrNull(alias, null); } + public static String getAnonymousPropertyNameByProperty(SQLEntityAliasSegment sqlEntityProject, TableAvailable anonymousTable) { + String propertyName = sqlEntityProject.getPropertyName(); + if (propertyName != null) { + ColumnMetadata columnMetadata = anonymousTable.getEntityMetadata().getProperty2ColumnMap().get(propertyName); + if (columnMetadata != null && !columnMetadata.isValueObject()) { + propertyName = columnMetadata.getPropertyName(); + } + } + return propertyName; + } + public static LocalDateTime getDayStart(LocalDateTime dateTime) { return dateTime.toLocalDate().atStartOfDay(); // 设置时分秒为 0:00:00 diff --git a/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/DbManager.java b/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/DbManager.java index 70c2fd59a..0fc1cbc92 100644 --- a/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/DbManager.java +++ b/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/DbManager.java @@ -2,6 +2,10 @@ import com.easy.query.clickhouse.config.ClickHouseDatabaseConfiguration; import com.easy.query.core.api.client.EasyQueryClient; +import com.easy.query.core.basic.entity.ColumnEntityMappingRule; +import com.easy.query.core.basic.entity.EntityMappingRule; +import com.easy.query.core.basic.entity.PropertyEntityMappingRule; +import com.easy.query.core.basic.entity.TryColumnAndPropertyEntityMappingRule; import com.easy.query.core.basic.extension.formater.MyBatisSQLParameterPrintFormat; import com.easy.query.core.basic.extension.formater.SQLParameterPrintFormat; import com.easy.query.core.basic.extension.track.InvokeTryFinally; @@ -28,6 +32,7 @@ import com.easy.query.core.configuration.nameconversion.impl.UpperCamelCaseNameConversion; import com.easy.query.core.configuration.nameconversion.impl.UpperUnderlinedNameConversion; import com.easy.query.core.datasource.DataSourceUnitFactory; +import com.easy.query.core.enums.EntityMappingStrategyEnum; import com.easy.query.core.logging.Log; import com.easy.query.core.logging.LogFactory; import com.easy.query.core.util.EasyStringUtil; @@ -177,6 +182,7 @@ private static EasyQueryHolder build(BeanWrap bw) { useNameConversion(solonEasyQueryProperties, easyQueryBuilderConfiguration); useMapKeyConversion(solonEasyQueryProperties, easyQueryBuilderConfiguration); usePropertyMode(solonEasyQueryProperties, easyQueryBuilderConfiguration); + useMappingStrategy(solonEasyQueryProperties, easyQueryBuilderConfiguration); SQLParameterPrintEnum sqlParameterPrint = solonEasyQueryProperties.getSQLParameterPrint(); if (sqlParameterPrint == SQLParameterPrintEnum.MYBATIS) { easyQueryBuilderConfiguration @@ -229,6 +235,20 @@ private static void usePropertyMode(SolonEasyQueryProperties solonEasyQueryPrope break; } } + private static void useMappingStrategy(SolonEasyQueryProperties solonEasyQueryProperties, EasyQueryBuilderConfiguration easyQueryBuilderConfiguration) { + EntityMappingStrategyEnum mappingStrategy = solonEasyQueryProperties.getMappingStrategy(); + switch (mappingStrategy) { + case COLUMN_ONLY: + easyQueryBuilderConfiguration.replaceService(EntityMappingRule.class, ColumnEntityMappingRule.class); + break; + case PROPERTY_ONLY: + easyQueryBuilderConfiguration.replaceService(EntityMappingRule.class, PropertyEntityMappingRule.class); + break; + case COLUMN_AND_PROPERTY: + easyQueryBuilderConfiguration.replaceService(EntityMappingRule.class, TryColumnAndPropertyEntityMappingRule.class); + break; + } + } private static void useMapKeyConversion(SolonEasyQueryProperties solonEasyQueryProperties, EasyQueryBuilderConfiguration easyQueryBuilderConfiguration) { MapKeyConversionEnum mapKeyConversionEnum = solonEasyQueryProperties.getMapKeyConversionEnum(); diff --git a/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/SolonEasyQueryProperties.java b/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/SolonEasyQueryProperties.java index 1fbedfb18..eecddf3de 100644 --- a/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/SolonEasyQueryProperties.java +++ b/sql-extension/sql-solon-plugin/src/main/java/com/easy/query/solon/integration/SolonEasyQueryProperties.java @@ -1,5 +1,6 @@ package com.easy.query.solon.integration; +import com.easy.query.core.enums.EntityMappingStrategyEnum; import com.easy.query.core.enums.RelationTableAppendEnum; import com.easy.query.core.enums.SQLExecuteStrategyEnum; import com.easy.query.core.enums.ShardingQueryInTransactionEnum; @@ -33,6 +34,7 @@ public class SolonEasyQueryProperties { private final static PropertyModeEnum propertyMode = PropertyModeEnum.FIRST_LOWER; private final static ShardingQueryInTransactionEnum shardingQueryInTransaction = ShardingQueryInTransactionEnum.SERIALIZABLE; private final static RelationTableAppendEnum relationTableAppend = RelationTableAppendEnum.SMART; + private final static EntityMappingStrategyEnum mappingStrategy = EntityMappingStrategyEnum.COLUMN_ONLY; /** * 仅分片时有效默认同时5个线程5 */ @@ -260,6 +262,16 @@ public PropertyModeEnum getPropertyMode() { return null; }); } + public EntityMappingStrategyEnum getMappingStrategy() { + return getOrDef("mapping-strategy",mappingStrategy,v->{ + switch (v){ + case "column_only":return EntityMappingStrategyEnum.COLUMN_ONLY; + case "property_only":return EntityMappingStrategyEnum.PROPERTY_ONLY; + case "column_and_property":return EntityMappingStrategyEnum.COLUMN_AND_PROPERTY; + } + return null; + }); + } public ShardingQueryInTransactionEnum getShardingQueryInTransaction() { return getOrDef("sharding-query-in-transaction",shardingQueryInTransaction,v->{ switch (v){ diff --git a/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/EasyQueryStarterAutoConfiguration.java b/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/EasyQueryStarterAutoConfiguration.java index 69badb781..bf5b5024b 100644 --- a/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/EasyQueryStarterAutoConfiguration.java +++ b/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/EasyQueryStarterAutoConfiguration.java @@ -8,6 +8,10 @@ import com.easy.query.api4j.client.EasyQuery; import com.easy.query.clickhouse.config.ClickHouseDatabaseConfiguration; import com.easy.query.core.api.client.EasyQueryClient; +import com.easy.query.core.basic.entity.ColumnEntityMappingRule; +import com.easy.query.core.basic.entity.EntityMappingRule; +import com.easy.query.core.basic.entity.PropertyEntityMappingRule; +import com.easy.query.core.basic.entity.TryColumnAndPropertyEntityMappingRule; import com.easy.query.core.basic.extension.conversion.ColumnValueSQLConverter; import com.easy.query.core.basic.extension.conversion.ValueConverter; import com.easy.query.core.basic.extension.encryption.EncryptionStrategy; @@ -268,6 +272,17 @@ public EasyQueryClient easyQueryClient(DatabaseConfiguration databaseConfigurati s.addService(PropertyDescriptorMatcher.class, EntityPropertyDescriptorMatcher.class); break; } + switch (easyQueryProperties.getMappingStrategy()){ + case COLUMN_ONLY: + s.addService(EntityMappingRule.class, ColumnEntityMappingRule.class); + break; + case PROPERTY_ONLY: + s.addService(EntityMappingRule.class, PropertyEntityMappingRule.class); + break; + case COLUMN_AND_PROPERTY: + s.addService(EntityMappingRule.class, TryColumnAndPropertyEntityMappingRule.class); + break; + } }) .replaceService(ConnectionManager.class, SpringConnectionManager.class) .replaceService(SQLParameterPrintFormat.class, getSQLParameterPrintFormatClass()) diff --git a/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/config/EasyQueryProperties.java b/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/config/EasyQueryProperties.java index 466dc23ae..09eabfcc9 100644 --- a/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/config/EasyQueryProperties.java +++ b/sql-extension/sql-springboot-starter/src/main/java/com/easy/query/sql/starter/config/EasyQueryProperties.java @@ -1,6 +1,7 @@ package com.easy.query.sql.starter.config; +import com.easy.query.core.enums.EntityMappingStrategyEnum; import com.easy.query.core.enums.RelationTableAppendEnum; import com.easy.query.core.enums.SQLExecuteStrategyEnum; import com.easy.query.core.enums.ShardingQueryInTransactionEnum; @@ -150,6 +151,10 @@ public class EasyQueryProperties { * 小于等于0表示不启用 */ private long reverseOffsetThreshold = 0; + /** + * 映射策略 + */ + private EntityMappingStrategyEnum mappingStrategy = EntityMappingStrategyEnum.COLUMN_ONLY; public Boolean getEnable() { return enable; @@ -467,6 +472,14 @@ public void setRelationTableAppend(RelationTableAppendEnum relationTableAppend) this.relationTableAppend = relationTableAppend; } + public EntityMappingStrategyEnum getMappingStrategy() { + return mappingStrategy; + } + + public void setMappingStrategy(EntityMappingStrategyEnum mappingStrategy) { + this.mappingStrategy = mappingStrategy; + } + public EasyQueryProperties() { } } diff --git a/sql-test/src/main/java/com/easy/query/test/QueryTest.java b/sql-test/src/main/java/com/easy/query/test/QueryTest.java index aa2ce9f16..42e91e14b 100644 --- a/sql-test/src/main/java/com/easy/query/test/QueryTest.java +++ b/sql-test/src/main/java/com/easy/query/test/QueryTest.java @@ -1039,6 +1039,7 @@ public void query39() { Queryable queryable = easyQuery.queryable(BlogEntity.class) .select(BlogEntityTest2.class); String sql = queryable.toSQL(); +// Assert.assertEquals("SELECT t.`title`,t.`content`,t.`star`,t.`publish_time`,t.`score`,t.`status`,t.`order`,t.`is_top`,t.`top` FROM `t_blog` t WHERE t.`deleted` = ?", sql); Assert.assertEquals("SELECT t.`title`,t.`content`,t.`star`,t.`publish_time`,t.`score`,t.`status`,t.`order`,t.`is_top`,t.`top` FROM `t_blog` t WHERE t.`deleted` = ?", sql); List blogEntityTest2s = easyQuery.queryable(BlogEntity.class) .select(BlogEntityTest2.class).toList(); diff --git a/sql-test/src/main/java/com/easy/query/test/QueryTest19.java b/sql-test/src/main/java/com/easy/query/test/QueryTest19.java index 8ca0e8f13..143f1c76f 100644 --- a/sql-test/src/main/java/com/easy/query/test/QueryTest19.java +++ b/sql-test/src/main/java/com/easy/query/test/QueryTest19.java @@ -3,12 +3,14 @@ import com.easy.query.api.proxy.base.LocalDateTimeProxy; import com.easy.query.api.proxy.base.StringProxy; import com.easy.query.api.proxy.entity.select.EntityQueryable; +import com.easy.query.api4j.select.Queryable; import com.easy.query.core.basic.extension.listener.JdbcExecuteAfterArg; import com.easy.query.core.expression.builder.core.NotNullOrEmptyValueFilter; import com.easy.query.core.proxy.core.draft.Draft2; import com.easy.query.core.proxy.sql.GroupKeys; import com.easy.query.core.proxy.sql.Select; import com.easy.query.core.util.EasySQLUtil; +import com.easy.query.test.doc.MyUser1; import com.easy.query.test.entity.BlogEntity; import com.easy.query.test.entity.MyCategory; import com.easy.query.test.entity.MyCategoryVO; @@ -294,6 +296,8 @@ public void aaa(){ .where(m -> { m.id().toNumber(Integer.class).add(1).eq(BigDecimal.valueOf(123)); }).toList(); + +// Queryable queryable = easyQuery.queryable(MyUser1.class); } diff --git a/sql-test/src/main/java/com/easy/query/test/RelationTest.java b/sql-test/src/main/java/com/easy/query/test/RelationTest.java index 42baba928..42b9b5db8 100644 --- a/sql-test/src/main/java/com/easy/query/test/RelationTest.java +++ b/sql-test/src/main/java/com/easy/query/test/RelationTest.java @@ -312,12 +312,13 @@ public void testOneToOne() { { JdbcExecuteAfterArg jdbcExecuteAfterArg = listenerContext.getJdbcExecuteAfterArgs().get(0); - Assert.assertEquals("SELECT t.`class_id`,t.`name`,t.`id` AS `__relation__id` FROM `school_student` t", jdbcExecuteAfterArg.getBeforeArg().getSql()); +// Assert.assertEquals("SELECT t.`class_id`,t.`name`,t.`id` AS `__relation__id` FROM `school_student` t", jdbcExecuteAfterArg.getBeforeArg().getSql()); + Assert.assertEquals("SELECT t.`id`,t.`class_id`,t.`name` FROM `school_student` t", jdbcExecuteAfterArg.getBeforeArg().getSql()); // Assert.assertEquals("1(Integer)", EasySQLUtil.sqlParameterToString(jdbcExecuteAfterArg.getBeforeArg().getSqlParameters().get(0))); } { JdbcExecuteAfterArg jdbcExecuteAfterArg = listenerContext.getJdbcExecuteAfterArgs().get(1); - Assert.assertEquals("SELECT t.`name`,t.`id` AS `__relation__id` FROM `school_class` t WHERE t.`id` IN (?,?)", jdbcExecuteAfterArg.getBeforeArg().getSql()); + Assert.assertEquals("SELECT t.`id`,t.`name` FROM `school_class` t WHERE t.`id` IN (?,?)", jdbcExecuteAfterArg.getBeforeArg().getSql()); Assert.assertEquals("class1(String),class2(String)", EasySQLUtil.sqlParameterToString(jdbcExecuteAfterArg.getBeforeArg().getSqlParameters().get(0))); } { diff --git a/sql-test/src/main/java/com/easy/query/test/doc/MyUser1.java b/sql-test/src/main/java/com/easy/query/test/doc/MyUser1.java new file mode 100644 index 000000000..9298f7cdc --- /dev/null +++ b/sql-test/src/main/java/com/easy/query/test/doc/MyUser1.java @@ -0,0 +1,22 @@ +package com.easy.query.test.doc; + +import com.easy.query.core.annotation.Column; +import com.easy.query.core.annotation.EntityProxy; +import com.easy.query.core.annotation.Table; +import com.easy.query.core.proxy.ProxyEntityAvailable; +import com.easy.query.test.doc.proxy.MyUserProxy; +import lombok.Data; + +/** + * create time 2024/10/14 11:03 + * 文件说明 + * + * @author xuejiaming + */ +@Data +@Table("my_user") +public class MyUser1 { + @Column("b") + private String a; + private String b; +} diff --git a/sql-test/src/main/java/com/easy/query/test/doc/dto/DocUserVO.java b/sql-test/src/main/java/com/easy/query/test/doc/dto/DocUserVO.java index 5cf7339dc..d152371e8 100644 --- a/sql-test/src/main/java/com/easy/query/test/doc/dto/DocUserVO.java +++ b/sql-test/src/main/java/com/easy/query/test/doc/dto/DocUserVO.java @@ -13,7 +13,7 @@ * @easy-query-dto schema: normal */ @Data -@SuppressWarnings("EasyQueryFieldMissMatch") +//@SuppressWarnings("EasyQueryFieldMissMatch") @EntityProxy public class DocUserVO { @@ -22,6 +22,8 @@ public class DocUserVO { private String name; private String phone; private Integer age; + + @SuppressWarnings("EasyQueryFieldMissMatch") private Long cardCount; } diff --git a/sql-test/src/main/java/com/easy/query/test/dto/autodto/SchoolStudentDTOAO111.java b/sql-test/src/main/java/com/easy/query/test/dto/autodto/SchoolStudentDTOAO111.java index dce1b2b51..425045be3 100644 --- a/sql-test/src/main/java/com/easy/query/test/dto/autodto/SchoolStudentDTOAO111.java +++ b/sql-test/src/main/java/com/easy/query/test/dto/autodto/SchoolStudentDTOAO111.java @@ -20,7 +20,6 @@ public class SchoolStudentDTOAO111 { - @Column(value = "EasyStringUtil.EMPTY") private String id; private String classId; private String name; @@ -36,7 +35,6 @@ public class SchoolStudentDTOAO111 { */ @Data public static class InternalSchoolClass { - @Column(value = "EasyStringUtil.EMPTY")//主键 private String id; private String name;