From df769aa863c56dae7e0a3f2c4996f30e31d5797d Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Wed, 10 May 2023 10:23:26 +0800 Subject: [PATCH] fix https://gitee.com/best_handsome/mybatis-plus-join/issues/I6ZANZ --- .../MybatisPlusJoinProperties.java | 5 +++ ...itional-spring-configuration-metadata.json | 6 +++ .../yulichang/config/ConfigProperties.java | 4 ++ .../github/yulichang/toolkit/TableList.java | 41 +++++++++++++++---- .../yulichang/wrapper/MPJLambdaWrapper.java | 11 ++++- .../yulichang/wrapper/segments/Select.java | 4 +- .../test/join/LambdaWrapperTest.java | 16 ++++++-- 7 files changed, 73 insertions(+), 14 deletions(-) diff --git a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java index e42d265..fdba2d8 100644 --- a/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java +++ b/mybatis-plus-join-boot-starter/src/main/java/com/github/yulichang/autoconfigure/MybatisPlusJoinProperties.java @@ -49,4 +49,9 @@ public class MybatisPlusJoinProperties { * 映射查询最大深度 */ private int mappingMaxCount = 5; + + /** + * 子查询别名 + */ + private String subQueryAlias = "st"; } diff --git a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 407dc88..936e2fa 100644 --- a/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/mybatis-plus-join-boot-starter/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -49,6 +49,12 @@ "defaultValue": 5, "type": "java.lang.Integer", "description": "映射查询最大深度." + }, + { + "name": "mybatis-plus-join.sub-query-alias", + "defaultValue": "st", + "type": "java.lang.String", + "description": "子查询表别名." } ], "hints": [ diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java index 80735b4..fa2350a 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/config/ConfigProperties.java @@ -38,4 +38,8 @@ public class ConfigProperties { * TableInfo适配器 */ public static ITableInfoAdapter tableInfoAdapter = AdapterHelper.getTableInfoAdapter(); + /** + * 子查询别名 + */ + public static String subQueryAlias = "st"; } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableList.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableList.java index 4b0bea7..18464cb 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableList.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/toolkit/TableList.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import lombok.Data; +import java.io.Serializable; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -13,7 +14,12 @@ import java.util.stream.Collectors; * @author yulichang */ @Data -public class TableList { +public class TableList implements Serializable { + + /** + * 上级 + */ + private TableList parent; /** * 所有关联的的表 @@ -65,7 +71,7 @@ public class TableList { } Node node = getByClassFirst(clazz); if (Objects.isNull(node)) { - return alias; + return Objects.isNull(parent) ? alias : parent.getPrefixByClassParent(clazz); } return node.isHasAlias() ? node.getAlias() : (node.getAlias() + node.getIndex()); } @@ -104,7 +110,7 @@ public class TableList { } } } - return alias; + return Objects.isNull(parent) ? alias : parent.getPrefixByClassParent(clazz); } Node node = getByIndex(index); Node dg = dg(node, node.getClazz()); @@ -118,7 +124,7 @@ public class TableList { if (list.size() == 1) { Node n = list.get(0); if (n.getClazz() == node.getClazz()) { - return alias; + return Objects.isNull(parent) ? alias : parent.getPrefixByClassParent(clazz); } else { return n.isHasAlias() ? n.getAlias() : (n.getAlias() + n.getIndex()); } @@ -128,9 +134,9 @@ public class TableList { return n.isHasAlias() ? n.getAlias() : (n.getAlias() + n.getIndex()); } } - return alias; + return Objects.isNull(parent) ? alias : parent.getPrefixByClassParent(clazz); } else { - return alias; + return Objects.isNull(parent) ? alias : parent.getPrefixByClassParent(clazz); } } } @@ -150,7 +156,11 @@ public class TableList { public String getPrefixByClass(Class clazz) { Node node = getByClassFirst(clazz); if (Objects.isNull(node)) { - return alias; + if (Objects.equals(rootClass, clazz)) { + return alias; + } else { + return Objects.isNull(parent) ? alias : parent.getPrefixByClassParent(clazz); + } } else { return node.hasAlias ? node.getAlias() : (node.getAlias() + node.getIndex()); } @@ -165,6 +175,21 @@ public class TableList { return node.hasAlias ? node.getAlias() : (node.getAlias() + node.getIndex()); } + public String getPrefixByClassParent(Class clazz) { + if (Objects.equals(clazz, rootClass)) { + return alias; + } + Node node = getByClassFirst(clazz); + if (Objects.isNull(node)) { + if (Objects.nonNull(parent)) { + return parent.getPrefixByClassParent(clazz); + } else { + return alias; + } + } + return node.hasAlias ? node.getAlias() : (node.getAlias() + node.getIndex()); + } + private Node getByIndex(int index) { return all.stream().filter(i -> i.getIndex() == index).findFirst().orElse(null); } @@ -194,7 +219,7 @@ public class TableList { } @Data - public static class Node { + public static class Node implements Serializable { /** * 关联表类型 diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 925d409..95c252c 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.SharedString; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; import com.baomidou.mybatisplus.core.toolkit.*; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.github.yulichang.config.ConfigProperties; import com.github.yulichang.toolkit.Constant; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.toolkit.TableList; @@ -183,12 +184,20 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectSub(Class clazz, Consumer> consumer, SFunction alias) { + return selectSub(clazz, ConfigProperties.subQueryAlias, consumer, alias); + } + + /** + * 子查询 + */ + public MPJLambdaWrapper selectSub(Class clazz, String st, Consumer> consumer, SFunction alias) { MPJLambdaWrapper wrapper = new MPJLambdaWrapper(null, clazz, SharedString.emptyString(), paramNameSeq, paramNameValuePairs, new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), new TableList(), null, null, null, null) { }; - String st = "st"; wrapper.tableList.setAlias(st); + wrapper.tableList.setRootClass(clazz); + wrapper.tableList.setParent(this.tableList); wrapper.alias = st; wrapper.subTableAlias = st; consumer.accept(wrapper); diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Select.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Select.java index bc31e0d..686278b 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Select.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/Select.java @@ -5,13 +5,15 @@ import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.wrapper.enums.BaseFuncEnum; import org.apache.ibatis.type.TypeHandler; +import java.io.Serializable; + /** * 查询列 * * @author yulichang * @since 1.3.10 */ -public interface Select { +public interface Select extends Serializable { Class getClazz(); diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java index 52ff454..0f0c480 100644 --- a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/LambdaWrapperTest.java @@ -1017,15 +1017,23 @@ class LambdaWrapperTest { */ @Test void sub() { - ThreadLocalUtils.set("SELECT ( SELECT st.id FROM `user` st WHERE st.del=false AND (st.id <= ?) limit 1 ) AS pid FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); + ThreadLocalUtils.set("SELECT ( SELECT st.id FROM `user` st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); MPJLambdaWrapper wrapper = JoinWrappers.lambda(UserDO.class) .selectSub(UserDO.class, w -> w.select(UserDO::getId) - .le(UserDO::getId, 1000) - .last("limit 1"), UserDO::getPid) + .eq(UserDO::getId, UserDO::getId) + .last("limit 1"), UserDO::getId) .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) .le(UserDO::getId, 100); wrapper.list(); - System.out.println(1); + + ThreadLocalUtils.set("SELECT ( SELECT st.id FROM address st WHERE st.del=false AND (st.id = t.id) limit 1 ) AS id FROM `user` t LEFT JOIN address t1 ON (t1.user_id = t.id) WHERE t.del=false AND t1.del=false AND (t.id <= ?)"); + MPJLambdaWrapper wrapper1 = JoinWrappers.lambda(UserDO.class) + .selectSub(AddressDO.class, w -> w.select(AddressDO::getId) + .eq(AddressDO::getId, UserDO::getId) + .last("limit 1"), UserDO::getId) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .le(UserDO::getId, 100); + wrapper1.list(); }