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;
+ }
}