yulichang 2024-05-18 05:24:23 +08:00
parent 4e284e504a
commit 4d1ad0d26e
8 changed files with 82 additions and 88 deletions

View File

@ -68,13 +68,13 @@ public @interface EntityMapping {
* 映射表查询条件之 orderBy<br/>
* 等效于 Wrappers.<T>query().orderByAsc(xxx);
*/
String orderByAsc() default "";
String[] orderByAsc() default "";
/**
* 映射表查询条件之 orderByDesc<br/>
* 等效于 Wrappers.<T>query().orderByDesc(xxx);
*/
String orderByDesc() default "";
String[] orderByDesc() default "";
/**
* 映射表查询条件之 last<br/>

View File

@ -66,13 +66,13 @@ public @interface FieldMapping {
* 映射表查询条件之 orderBy<br/>
* 等效于 Wrappers.<T>query().orderByAsc(xxx);
*/
String orderByAsc() default "";
String[] orderByAsc() default "";
/**
* 映射表查询条件之 orderByDesc<br/>
* 等效于 Wrappers.<T>query().orderByDesc(xxx);
*/
String orderByDesc() default "";
String[] orderByDesc() default "";
/**
* 映射表查询条件之 last<br/>

View File

@ -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<T> {
private static final DeepConfig<?> defaultConfig = new DeepConfig<>();
@Setter
private List<SFunction<T, ?>> property;
@Setter
private boolean loop = false;
@Setter
private int deep = ConfigProperties.mappingMaxCount;
@Setter
private int maxDeep = ConfigProperties.mappingMaxCount;
public static <T> Builder<T> builder() {

View File

@ -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<String> 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) {
List<SelectCache> 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<SelectCache> listField = ColumnCache.getListField(joinClass);
Set<String> colSet = listField.stream().map(SelectCache::getColumn).collect(Collectors.toSet());
List<String> 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<SelectCache> listField = ColumnCache.getListField(joinClass);
Set<String> colSet = listField.stream().map(SelectCache::getColumn).collect(Collectors.toSet());
List<String> 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

View File

@ -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());

View File

@ -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<String> 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<AddressDO> addressList;
}

View File

@ -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);
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);

View File

@ -61,4 +61,10 @@ class MappingTest {
assert dos.get(0).getArea() != null;
dos.forEach(System.out::println);
}
@Test
public void testJoin2() {
List<UserDO> dos = userService.listDeep(Wrappers.emptyWrapper());
assert dos.get(0).getAddressList().get(0).getId() != null;
}
}