diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/RelationManager.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/RelationManager.java index bfa90bc6..8bb15149 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/RelationManager.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/RelationManager.java @@ -67,11 +67,18 @@ public class RelationManager { private static ThreadLocal> ignoreRelations = new ThreadLocal<>(); + /** + * 查询时,仅查询这个配置的 Relations + */ + private static ThreadLocal> onlyQueryRelations = new ThreadLocal<>(); + + /** * 每次查询是否自动清除 depth extraConditionParams ignoreRelations 的配置 */ private static ThreadLocal autoClearConfig = ThreadLocal.withInitial(() -> true); + public static int getDefaultQueryDepth() { return defaultQueryDepth; } @@ -115,6 +122,11 @@ public class RelationManager { } + //////ignore relations ////// + public static Set getIgnoreRelations() { + return ignoreRelations.get(); + } + public static void setIgnoreRelations(Set ignoreRelations) { RelationManager.ignoreRelations.set(ignoreRelations); } @@ -141,15 +153,49 @@ public class RelationManager { relations.addAll(Arrays.asList(ignoreRelations)); } - public static Set getIgnoreRelations() { - return ignoreRelations.get(); - } public static void clearIgnoreRelations() { ignoreRelations.remove(); } + //////query relations ////// + public static Set getQueryRelations() { + return onlyQueryRelations.get(); + } + + public static void setQueryRelations(Set queryRelations) { + RelationManager.onlyQueryRelations.set(queryRelations); + } + + + public static void addQueryRelations(LambdaGetter... queryRelations) { + Set relations = RelationManager.onlyQueryRelations.get(); + if (relations == null) { + relations = new HashSet<>(); + setQueryRelations(relations); + } + for (LambdaGetter lambdaGetter : queryRelations) { + String fieldName = LambdaUtil.getFieldName(lambdaGetter); + relations.add(fieldName); + } + } + + public static void addQueryRelations(String... queryRelations) { + Set relations = RelationManager.onlyQueryRelations.get(); + if (relations == null) { + relations = new HashSet<>(); + setQueryRelations(relations); + } + relations.addAll(Arrays.asList(queryRelations)); + } + + + public static void clearQueryRelations() { + onlyQueryRelations.remove(); + } + + public static void setAutoClearConfig(boolean enable) { autoClearConfig.set(enable); } @@ -214,7 +260,7 @@ public class RelationManager { public static void queryRelations(BaseMapper mapper, List entities) { - doQueryRelations(mapper, entities, 0, depthThreadLocal.get(), ignoreRelations.get()); + doQueryRelations(mapper, entities, 0, depthThreadLocal.get(), ignoreRelations.get(), onlyQueryRelations.get()); clearConfigIfNecessary(); } @@ -226,13 +272,14 @@ public class RelationManager { if (autoClearEnable != null && autoClearEnable) { depthThreadLocal.remove(); extraConditionParams.remove(); + onlyQueryRelations.remove(); ignoreRelations.remove(); } } @SuppressWarnings({"rawtypes", "unchecked"}) - static void doQueryRelations(BaseMapper mapper, List entities, int currentDepth, int maxDepth, Set ignoreRelations) { + static void doQueryRelations(BaseMapper mapper, List entities, int currentDepth, int maxDepth, Set ignoreRelations, Set queryRelations) { if (CollectionUtil.isEmpty(entities)) { return; } @@ -257,6 +304,14 @@ public class RelationManager { return; } + //only query + if (queryRelations != null && !queryRelations.isEmpty() + && !queryRelations.contains(relation.getSimpleName()) + && !queryRelations.contains(relation.getName())) { + return; + } + + Set targetValues; List mappingRows = null; @@ -309,7 +364,7 @@ public class RelationManager { if (CollectionUtil.isNotEmpty(targetObjectList)) { //递归查询 - doQueryRelations(mapper, targetObjectList, currentDepth + 1, maxDepth, ignoreRelations); + doQueryRelations(mapper, targetObjectList, currentDepth + 1, maxDepth, ignoreRelations, queryRelations); //进行内存 join relation.join(entities, targetObjectList, mappingRows);