diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java index bd3fe487..2e41076c 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/table/TableInfo.java @@ -84,7 +84,6 @@ import java.util.StringJoiner; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; -import java.util.stream.Stream; import static com.mybatisflex.core.constant.SqlConsts.AND; import static com.mybatisflex.core.constant.SqlConsts.EQUALS_PLACEHOLDER; @@ -1036,18 +1035,35 @@ public class TableInfo { .collect(Collectors.toList()); } + private void getCombinedColumns(List> existedEntities, Class entityClass, List combinedColumns) { + if (existedEntities.contains(entityClass)) { + return; + } + + existedEntities.add(entityClass); + + TableInfo tableInfo = TableInfoFactory.ofEntityClass(entityClass); + + combinedColumns.addAll(Arrays.asList(tableInfo.allColumns)); + + if (tableInfo.collectionType != null) { + tableInfo.collectionType.values() + .forEach(e -> getCombinedColumns(existedEntities, e, combinedColumns)); + } + + if (tableInfo.associationType != null) { + tableInfo.associationType.values() + .forEach(e -> getCombinedColumns(existedEntities, e, combinedColumns)); + } + } public ResultMap buildResultMap(Configuration configuration) { - // 所有的嵌套类对象引用 - Stream> ct = collectionType == null ? Stream.empty() : collectionType.values().stream(); - Stream> at = associationType == null ? Stream.empty() : associationType.values().stream(); + List combinedColumns = new ArrayList<>(); - Stream nestedColumns = Stream.concat(at, ct) - .map(TableInfoFactory::ofEntityClass) - .flatMap(e -> Arrays.stream(e.allColumns)); + getCombinedColumns(new ArrayList<>(), entityClass, combinedColumns); // 预加载所有重复列,用于判断重名属性 - List existedColumns = Stream.concat(Arrays.stream(allColumns), nestedColumns) + List existedColumns = combinedColumns.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) .entrySet() .stream()