From 4d1ad0d26e79b7e563482b8cfb8579d4a26b0db5 Mon Sep 17 00:00:00 2001 From: yulichang <570810310@qq.com> Date: Sat, 18 May 2024 05:24:23 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9Ahttps://github.com/yulichang/mybati?= =?UTF-8?q?s-plus-join/issues/135?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yulichang/annotation/EntityMapping.java | 4 +- .../yulichang/annotation/FieldMapping.java | 4 +- .../extension/mapping/config/DeepConfig.java | 9 +- .../mapping/mapper/MPJMappingWrapper.java | 87 +++++++++---------- .../mapping/mapper/MPJTableFieldInfo.java | 10 +-- .../yulichang/test/mapping/entity/UserDO.java | 6 +- .../src/main/resources/db/data.sql | 44 +++++----- .../yulichang/test/mapping/MappingTest.java | 6 ++ 8 files changed, 82 insertions(+), 88 deletions(-) diff --git a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java index 5af8df4..9dd7bc3 100644 --- a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java +++ b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/EntityMapping.java @@ -68,13 +68,13 @@ public @interface EntityMapping { * 映射表查询条件之 orderBy
* 等效于 Wrappers.query().orderByAsc(xxx); */ - String orderByAsc() default ""; + String[] orderByAsc() default ""; /** * 映射表查询条件之 orderByDesc
* 等效于 Wrappers.query().orderByDesc(xxx); */ - String orderByDesc() default ""; + String[] orderByDesc() default ""; /** * 映射表查询条件之 last
diff --git a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/FieldMapping.java b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/FieldMapping.java index 2ecf851..b689aa1 100644 --- a/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/FieldMapping.java +++ b/mybatis-plus-join-annotation/src/main/java/com/github/yulichang/annotation/FieldMapping.java @@ -66,13 +66,13 @@ public @interface FieldMapping { * 映射表查询条件之 orderBy
* 等效于 Wrappers.query().orderByAsc(xxx); */ - String orderByAsc() default ""; + String[] orderByAsc() default ""; /** * 映射表查询条件之 orderByDesc
* 等效于 Wrappers.query().orderByDesc(xxx); */ - String orderByDesc() default ""; + String[] orderByDesc() default ""; /** * 映射表查询条件之 last
diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java index 5879f55..bf9cb4a 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/config/DeepConfig.java @@ -3,8 +3,7 @@ package com.github.yulichang.extension.mapping.config; import com.baomidou.mybatisplus.core.toolkit.Assert; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.config.ConfigProperties; -import lombok.Getter; -import lombok.Setter; +import lombok.Data; import lombok.experimental.Accessors; import java.util.ArrayList; @@ -18,22 +17,18 @@ import java.util.Objects; * @author yulichang * @since 1.4.5 */ -@Getter +@Data @Accessors(chain = true) public class DeepConfig { private static final DeepConfig defaultConfig = new DeepConfig<>(); - @Setter private List> property; - @Setter private boolean loop = false; - @Setter private int deep = ConfigProperties.mappingMaxCount; - @Setter private int maxDeep = ConfigProperties.mappingMaxCount; public static Builder builder() { diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJMappingWrapper.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJMappingWrapper.java index 82afad8..a9a69e1 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJMappingWrapper.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJMappingWrapper.java @@ -4,13 +4,13 @@ package com.github.yulichang.extension.mapping.mapper; import com.baomidou.mybatisplus.core.enums.SqlKeyword; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.github.yulichang.toolkit.support.ColumnCache; +import com.github.yulichang.wrapper.segments.SelectCache; import lombok.AllArgsConstructor; import lombok.Getter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; +import java.util.*; +import java.util.stream.Collectors; /** * 关联查询条件 @@ -42,8 +42,8 @@ public class MPJMappingWrapper { private final boolean hasOrderByDesc; private List orderByDesc; - public MPJMappingWrapper(String first, String select, com.github.yulichang.annotation.Apply[] applys, - com.github.yulichang.annotation.Condition[] conditions, String last, String orderByAsc, String orderByDesc) { + public MPJMappingWrapper(Class joinClass, String first, String select, com.github.yulichang.annotation.Apply[] applyArr, + com.github.yulichang.annotation.Condition[] conditions, String last, String[] orderByAsc, String[] orderByDesc) { this.hasFirst = StringUtils.isNotBlank(first); if (this.hasFirst) { this.first = first; @@ -54,10 +54,10 @@ public class MPJMappingWrapper { this.select = select; } - this.hasApply = applys.length > 0; + this.hasApply = applyArr.length > 0; if (this.hasApply) { this.applyList = new ArrayList<>(); - for (com.github.yulichang.annotation.Apply apply : applys) { + for (com.github.yulichang.annotation.Apply apply : applyArr) { this.applyList.add(new Apply(apply.value(), apply.args())); } } @@ -66,7 +66,15 @@ public class MPJMappingWrapper { if (this.hasCondition) { this.conditionList = new ArrayList<>(); for (com.github.yulichang.annotation.Condition condition : conditions) { - conditionList.add(new Condition(convert(condition.keyWord()), condition.column(), condition.value())); + List listField = ColumnCache.getListField(joinClass); + if (listField.stream().anyMatch(f -> f.getColumn().equals(condition.column().trim()))) { + conditionList.add(new Condition(convert(condition.keyWord()), condition.column(), condition.value())); + } else { + //通过属性获取 + String col = listField.stream().filter(f -> f.getColumProperty().equals(condition.column())).findFirst() + .map(SelectCache::getColumn).orElse(condition.column()); + conditionList.add(new Condition(convert(condition.keyWord()), col, condition.value())); + } } } @@ -75,55 +83,38 @@ public class MPJMappingWrapper { this.last = last; } - this.hasOrderByAsc = StringUtils.isNotBlank(orderByAsc); + this.hasOrderByAsc = orderByAsc.length > 0; if (this.hasOrderByAsc) { - this.orderByAsc = Arrays.asList(orderByAsc.split(StringPool.COMMA)); + List listField = ColumnCache.getListField(joinClass); + Set colSet = listField.stream().map(SelectCache::getColumn).collect(Collectors.toSet()); + List allColumns = new ArrayList<>(); + for (String orderBy : orderByAsc) { + allColumns.addAll(Arrays.asList(orderBy.split(StringPool.COMMA))); + } + this.orderByAsc = allColumns.stream().filter(StringUtils::isNotBlank).map(String::trim).map(f -> + colSet.contains(f) ? f : listField.stream().filter(s -> s.getColumProperty().equals(f)) + .findFirst().map(SelectCache::getColumn).orElse(f)).collect(Collectors.toList()); } - this.hasOrderByDesc = StringUtils.isNotBlank(orderByDesc); + this.hasOrderByDesc = orderByDesc.length > 0; if (this.hasOrderByDesc) { - this.orderByDesc = Arrays.asList(orderByDesc.split(StringPool.COMMA)); + List listField = ColumnCache.getListField(joinClass); + Set colSet = listField.stream().map(SelectCache::getColumn).collect(Collectors.toSet()); + List allColumns = new ArrayList<>(); + for (String orderBy : orderByDesc) { + allColumns.addAll(Arrays.asList(orderBy.split(StringPool.COMMA))); + } + this.orderByDesc = allColumns.stream().filter(StringUtils::isNotBlank).map(String::trim).map(f -> + colSet.contains(f) ? f : listField.stream().filter(s -> s.getColumProperty().equals(f)) + .findFirst().map(SelectCache::getColumn).orElse(f)).collect(Collectors.toList()); } } - private SqlKeyword convert(com.github.yulichang.annotation.enums.SqlKeyword sqlKeyword) { + public static SqlKeyword convert(com.github.yulichang.annotation.enums.SqlKeyword sqlKeyword) { if (Objects.isNull(sqlKeyword)) { return null; } - switch (sqlKeyword) { - case NOT: - return SqlKeyword.NOT; - case IN: - return SqlKeyword.IN; - case NOT_IN: - return SqlKeyword.NOT_IN; - case LIKE: - return SqlKeyword.LIKE; - case NOT_LIKE: - return SqlKeyword.NOT_LIKE; - case EQ: - return SqlKeyword.EQ; - case NE: - return SqlKeyword.NE; - case GT: - return SqlKeyword.GT; - case GE: - return SqlKeyword.GE; - case LT: - return SqlKeyword.LT; - case LE: - return SqlKeyword.LE; - case IS_NULL: - return SqlKeyword.IS_NULL; - case IS_NOT_NULL: - return SqlKeyword.IS_NOT_NULL; - case BETWEEN: - return SqlKeyword.BETWEEN; - case NOT_BETWEEN: - return SqlKeyword.NOT_BETWEEN; - default: - return SqlKeyword.EQ; - } + return SqlKeyword.valueOf(sqlKeyword.name()); } @Getter diff --git a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java index 4e40ba0..0dffdf7 100644 --- a/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java +++ b/mybatis-plus-join-extension/src/main/java/com/github/yulichang/extension/mapping/mapper/MPJTableFieldInfo.java @@ -11,9 +11,8 @@ import com.github.yulichang.toolkit.SpringContentUtils; import com.github.yulichang.toolkit.TableHelper; import com.github.yulichang.toolkit.support.ColumnCache; import com.github.yulichang.wrapper.segments.SelectCache; +import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; @@ -27,8 +26,7 @@ import java.util.stream.Collectors; * @author yulichang * @since 1.2.0 */ -@Getter -@ToString +@Data @EqualsAndHashCode public class MPJTableFieldInfo { @@ -122,7 +120,7 @@ public class MPJTableFieldInfo { this.isRemoveBindField = checkArr(mapping.select()) && (!Arrays.asList(mapping.select()).contains(this.joinProperty.trim()) && !Arrays.asList(mapping.select()).contains(this.joinColumn.trim())); - this.wrapper = new MPJMappingWrapper(mapping.first(), checkArr(mapping.select()) ? + this.wrapper = new MPJMappingWrapper(this.joinClass, mapping.first(), checkArr(mapping.select()) ? (this.isRemoveBindField ? propToColumn(this.joinClass, mapping.select(), this.joinProperty) : propToColumn(this.joinClass, mapping.select(), null)) : null, mapping.apply(), mapping.condition(), mapping.last(), mapping.orderByAsc(), mapping.orderByDesc()); @@ -145,7 +143,7 @@ public class MPJTableFieldInfo { initJoinField(mappingField.joinField()); this.isRemoveBindField = !mappingField.select().equals(this.joinColumn.trim()) && !mappingField.select().equals(this.joinProperty.trim()); - this.wrapper = new MPJMappingWrapper(mappingField.first(), this.isRemoveBindField ? + this.wrapper = new MPJMappingWrapper(this.joinClass, mappingField.first(), this.isRemoveBindField ? propToColumn(this.joinClass, new String[]{mappingField.select()}, this.joinProperty) : propToColumn(this.joinClass, new String[]{mappingField.select()}, null), mappingField.apply(), mappingField.condition(), mappingField.last(), mappingField.orderByAsc(), mappingField.orderByDesc()); diff --git a/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java b/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java index 1248b01..b07a984 100644 --- a/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java +++ b/mybatis-plus-join-test/test-mapping/src/main/java/com/github/yulichang/test/mapping/entity/UserDO.java @@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; +import com.github.yulichang.annotation.Condition; import com.github.yulichang.annotation.EntityMapping; import com.github.yulichang.annotation.FieldMapping; +import com.github.yulichang.annotation.enums.SqlKeyword; import com.github.yulichang.test.mapping.enums.Sex; import lombok.Data; import lombok.EqualsAndHashCode; @@ -53,6 +55,8 @@ public class UserDO { private List pName; @TableField(exist = false) - @EntityMapping(thisField = "id", joinField = "userId") + @EntityMapping(thisField = "id", joinField = "userId", condition = { + @Condition(column = "userId", keyWord = SqlKeyword.GE, value = "0") + }, orderByAsc = "userId", orderByDesc = "areaId") private List addressList; } diff --git a/mybatis-plus-join-test/test-mapping/src/main/resources/db/data.sql b/mybatis-plus-join-test/test-mapping/src/main/resources/db/data.sql index b0e1861..44e38eb 100644 --- a/mybatis-plus-join-test/test-mapping/src/main/resources/db/data.sql +++ b/mybatis-plus-join-test/test-mapping/src/main/resources/db/data.sql @@ -55,25 +55,25 @@ INSERT INTO `user` (id, pid, `name`, `address_id`, sex, head_img, del) VALUES (2 DELETE FROM address; -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 1, 1, 10001, '北京01', '10000000001', '曹县01', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 2, 1, 10002, '北京02', '10000000002', '曹县02', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 3, 1, 10003, '北京03', '10000000003', '曹县03', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 4, 1, 10004, '北京04', '10000000004', '曹县04', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 5, 1, 10005, '北京05', '10000000005', '曹县05', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 6, 1, 10006, '北京06', '10000000006', '曹县06', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 7, 1, 10007, '北京07', '10000000007', '曹县07', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 8, 1, 10008, '北京08', '10000000008', '曹县08', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 9, 1, 10009, '北京09', '10000000009', '曹县09', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (10,10, 10010, '北京10', '10000000010', '曹县10', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (11,11, 10011, '北京11', '10000000011', '曹县11', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (12,12, 10012, '北京12', '10000000012', '曹县12', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (13,13, 10013, '北京13', '10000000013', '曹县13', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (14,14, 10014, '北京14', '10000000014', '曹县14', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (15,15, 10015, '北京15', '10000000015', '曹县15', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (16,16, 10016, '北京16', '10000000016', '曹县16', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (17,17, 10017, '北京17', '10000000017', '曹县17', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (18,18, 10018, '北京18', '10000000018', '曹县18', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (19,19, 10019, '北京19', '10000000019', '曹县19', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (20,20, 10020, '北京20', '10000000020', '曹县20', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (21,21, 10021, '北京21', '10000000021', '曹县21', false); -INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (22,22, 10022, '北京22', '10000000022', '曹县22', false); \ No newline at end of file +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 1, 1, 10001, '北京01', '10000000001', '人民广场01', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 2, 1, 10002, '北京02', '10000000002', '人民广场02', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 3, 1, 10003, '北京03', '10000000003', '人民广场03', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 4, 1, 10004, '北京04', '10000000004', '人民广场04', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 5, 1, 10005, '北京05', '10000000005', '人民广场05', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 6, 1, 10006, '北京06', '10000000006', '人民广场06', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 7, 1, 10007, '北京07', '10000000007', '人民广场07', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 8, 1, 10008, '北京08', '10000000008', '人民广场08', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES ( 9, 1, 10009, '北京09', '10000000009', '人民广场09', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (10,10, 10010, '北京10', '10000000010', '人民广场10', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (11,11, 10011, '北京11', '10000000011', '人民广场11', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (12,12, 10012, '北京12', '10000000012', '人民广场12', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (13,13, 10013, '北京13', '10000000013', '人民广场13', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (14,14, 10014, '北京14', '10000000014', '人民广场14', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (15,15, 10015, '北京15', '10000000015', '人民广场15', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (16,16, 10016, '北京16', '10000000016', '人民广场16', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (17,17, 10017, '北京17', '10000000017', '人民广场17', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (18,18, 10018, '北京18', '10000000018', '人民广场18', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (19,19, 10019, '北京19', '10000000019', '人民广场19', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (20,20, 10020, '北京20', '10000000020', '人民广场20', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (21,21, 10021, '北京21', '10000000021', '人民广场21', false); +INSERT INTO address (id, user_id, area_id, city, tel, address, del) VALUES (22,22, 10022, '北京22', '10000000022', '人民广场22', false); \ No newline at end of file diff --git a/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java b/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java index 596afc2..59a72fe 100644 --- a/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java +++ b/mybatis-plus-join-test/test-mapping/src/test/java/com/github/yulichang/test/mapping/MappingTest.java @@ -61,4 +61,10 @@ class MappingTest { assert dos.get(0).getArea() != null; dos.forEach(System.out::println); } + + @Test + public void testJoin2() { + List dos = userService.listDeep(Wrappers.emptyWrapper()); + assert dos.get(0).getAddressList().get(0).getId() != null; + } }