diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java index 13b78826..7a30a829 100644 --- a/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java +++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/relation/AbstractRelation.java @@ -33,6 +33,7 @@ import static com.mybatisflex.core.query.QueryMethods.column; abstract class AbstractRelation { protected String name; + protected String simpleName; protected Class selfEntityClass; protected Field relationField; protected FieldWrapper relationFieldWrapper; @@ -62,6 +63,7 @@ abstract class AbstractRelation { String extraCondition ) { this.name = entityClass.getSimpleName()+"."+relationField.getName(); + this.simpleName = relationField.getName(); this.selfEntityClass = entityClass; this.relationField = relationField; this.relationFieldWrapper = FieldWrapper.of(entityClass, relationField.getName()); @@ -139,8 +141,8 @@ abstract class AbstractRelation { return name; } - public void setName(String name) { - this.name = name; + public String getSimpleName() { + return simpleName; } public Class getSelfEntityClass() { 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 604b9007..ca91ee46 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 @@ -56,6 +56,12 @@ public class RelationManager { private static ThreadLocal> extraConditionParams = new ThreadLocal<>(); + /** + * 查询时,可忽略某些已经添加 Relation 注解的属性 + */ + private static ThreadLocal> ignoreRelations = new ThreadLocal<>(); + + private static List getRelations(Class clazz) { return MapUtil.computeIfAbsent(classRelations, clazz, RelationManager::doGetRelations); } @@ -112,6 +118,23 @@ public class RelationManager { return extraConditionParams.get(); } + public static void setIgnoreRelations(Set ignoreRelations) { + RelationManager.ignoreRelations.set(ignoreRelations); + } + + public static void addIgnoreRelations(String... ignoreRelations) { + Set relations = RelationManager.ignoreRelations.get(); + if (relations == null) { + relations = new HashSet<>(); + setIgnoreRelations(relations); + } + relations.addAll(Arrays.asList(ignoreRelations)); + } + + public static Set getIgnoreRelations() { + return ignoreRelations.get(); + } + static Object[] getExtraConditionParams(List keys) { if (keys == null || keys.isEmpty()) { @@ -132,12 +155,12 @@ public class RelationManager { public static void queryRelations(BaseMapper mapper, List entities) { - doQueryRelations(mapper, entities, 0, depthThreadLocal.get()); + doQueryRelations(mapper, entities, 0, depthThreadLocal.get(), ignoreRelations.get()); } @SuppressWarnings({"rawtypes", "unchecked"}) - static void doQueryRelations(BaseMapper mapper, List entities, int currentDepth, int maxDepth) { + static void doQueryRelations(BaseMapper mapper, List entities, int currentDepth, int maxDepth, Set ignoreRelations) { if (CollectionUtil.isEmpty(entities)) { return; } @@ -155,6 +178,12 @@ public class RelationManager { try { relations.forEach(relation -> { + //ignore + if (ignoreRelations != null && (ignoreRelations.contains(relation.getSimpleName()) + || ignoreRelations.contains(relation.getName()))) { + return; + } + Set targetValues; List mappingRows = null; @@ -205,7 +234,7 @@ public class RelationManager { QueryWrapper queryWrapper = relation.buildQueryWrapper(targetValues); List targetObjectList = mapper.selectListByQueryAs(queryWrapper, relation.getMappingType()); if (CollectionUtil.isNotEmpty(targetObjectList)) { - doQueryRelations(mapper, targetObjectList, currentDepth + 1, maxDepth); + doQueryRelations(mapper, targetObjectList, currentDepth + 1, maxDepth, ignoreRelations); relation.join(entities, targetObjectList, mappingRows); } } finally { diff --git a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/RelationsTester.java b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/RelationsTester.java index 2d5fe7eb..df32034a 100644 --- a/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/RelationsTester.java +++ b/mybatis-flex-test/mybatis-flex-native-test/src/main/java/com/mybatisflex/test/relation/onetoone/RelationsTester.java @@ -103,6 +103,16 @@ public class RelationsTester { System.out.println( JSON.toJSONString(menus)); } + @Test + public void testMenuIgnoreParent() { + QueryWrapper qw = QueryWrapper.create(); + qw.where(MENU.PARENT_ID.eq(0)); + + RelationManager.addIgnoreRelations("parent"); + List menus = menuMapper.selectListWithRelationsByQuery(qw); + System.out.println( JSON.toJSONString(menus)); + } + @Test public void testPaginate() { Page accountPage = accountMapper.paginateWithRelations(1, 2, QueryWrapper.create());