refactor: optimize ToManyRelation.java

This commit is contained in:
Michael Yang 2024-02-29 11:44:57 +08:00
parent 69216d926e
commit 5a5dd3c0ec
2 changed files with 31 additions and 25 deletions

View File

@ -22,6 +22,7 @@ import com.mybatisflex.core.util.*;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.*; import java.util.*;
import java.util.function.Function;
class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> { class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
@ -41,9 +42,9 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
String dataSource, Class<SelfEntity> selfEntityClass, Field relationField, String dataSource, Class<SelfEntity> selfEntityClass, Field relationField,
String extraCondition, String[] selectColumns) { String extraCondition, String[] selectColumns) {
super(selfField, targetSchema, targetTable, targetField, valueField, super(selfField, targetSchema, targetTable, targetField, valueField,
joinTable, joinSelfColumn, joinTargetColumn, joinTable, joinSelfColumn, joinTargetColumn,
dataSource, selfEntityClass, relationField, dataSource, selfEntityClass, relationField,
extraCondition, selectColumns extraCondition, selectColumns
); );
} }
@ -103,7 +104,7 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
for (Object targetObject : targetObjectList) { for (Object targetObject : targetObjectList) {
Object targetJoinFieldValue = targetFieldWrapper.get(targetObject); Object targetJoinFieldValue = targetFieldWrapper.get(targetObject);
if (targetJoinFieldValue != null) { if (targetJoinFieldValue != null) {
leftFieldToRightTableMap.computeIfAbsent(targetJoinFieldValue.toString(), k -> new ArrayList<>()).add(targetObject); leftFieldToRightTableMap.computeIfAbsent(targetJoinFieldValue.toString(), k -> new ArrayList<>(1)).add(targetObject);
} }
} }
@ -128,14 +129,13 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
} }
leftFieldToRightTableMap = temp; leftFieldToRightTableMap = temp;
} }
//关联集合的类型 //关联集合的类型
Class<?> fieldType = relationFieldWrapper.getFieldType(); Class<?> fieldType = relationFieldWrapper.getFieldType();
Class<?> wrapType; boolean isMapType = Map.class.isAssignableFrom(fieldType);
if (Map.class.isAssignableFrom(fieldType)) { Class<?> wrapType = isMapType ? getMapWrapType(fieldType) : MapperUtil.getCollectionWrapType(fieldType);
wrapType = getMapWrapType(fieldType); boolean splitMode = StringUtil.isNotBlank(selfValueSplitBy);
} else {
wrapType = MapperUtil.getCollectionWrapType(fieldType);
}
for (SelfEntity selfEntity : selfEntities) { for (SelfEntity selfEntity : selfEntities) {
if (selfEntity == null) { if (selfEntity == null) {
@ -146,8 +146,10 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
continue; continue;
} }
selfValue = selfValue.toString(); selfValue = selfValue.toString();
Set<String> targetMappingValues;//只有当splitBy不为空时才会有多个值
boolean splitMode = StringUtil.isNotBlank(selfValueSplitBy); //只有当splitBy不为空时才会有多个值
Set<String> targetMappingValues;
if (splitMode) { if (splitMode) {
String[] splitValues = ((String) selfValue).split(selfValueSplitBy); String[] splitValues = ((String) selfValue).split(selfValueSplitBy);
targetMappingValues = new LinkedHashSet<>(Arrays.asList(splitValues)); targetMappingValues = new LinkedHashSet<>(Arrays.asList(splitValues));
@ -160,9 +162,8 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
return; return;
} }
// map
//map if (isMapType) {
if (Map.class.isAssignableFrom(fieldType)) {
Map map = (Map) ClassUtil.newInstance(wrapType); Map map = (Map) ClassUtil.newInstance(wrapType);
Set<Object> validateCountSet = new HashSet<>(targetMappingValues.size()); Set<Object> validateCountSet = new HashSet<>(targetMappingValues.size());
for (String targetMappingValue : targetMappingValues) { for (String targetMappingValue : targetMappingValues) {
@ -174,17 +175,18 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
for (Object targetObject : targetObjects) { for (Object targetObject : targetObjects) {
Object keyValue = mapKeyFieldWrapper.get(targetObject); Object keyValue = mapKeyFieldWrapper.get(targetObject);
Object needKeyValue = ConvertUtil.convert(keyValue, relationFieldWrapper.getKeyType()); Object needKeyValue = ConvertUtil.convert(keyValue, relationFieldWrapper.getKeyType());
if (validateCountSet.contains(needKeyValue) ) { if (validateCountSet.contains(needKeyValue)) {
//当字段类型为Map时一个key对应的value只能有一个 //当字段类型为Map时一个key对应的value只能有一个
throw FlexExceptions.wrap("When fieldType is Map, the target entity can only be one,\n" + throw FlexExceptions.wrap("When fieldType is Map, the target entity can only be one,\n" +
" current entity type is : " + selfEntity + "\n" + " current entity type is : " + selfEntity + "\n" +
" relation field name is : " + relationField.getName() + "\n" + " relation field name is : " + relationField.getName() + "\n" +
" target entity is : " + targetObjects); " target entity is : " + targetObjects);
} }
validateCountSet.add(needKeyValue); validateCountSet.add(needKeyValue);
//noinspection unchecked
map.put(needKeyValue, targetObject); map.put(needKeyValue, targetObject);
} }
} }
if (!map.isEmpty()) { if (!map.isEmpty()) {
relationFieldWrapper.set(map, selfEntity); relationFieldWrapper.set(map, selfEntity);
@ -205,6 +207,7 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
} }
for (Object targetObject : targetObjects) { for (Object targetObject : targetObjects) {
//仅绑定某个字段 //仅绑定某个字段
//noinspection unchecked
collection.add(fieldValueFieldWrapper.get(targetObject)); collection.add(fieldValueFieldWrapper.get(targetObject));
} }
} }
@ -214,11 +217,12 @@ class ToManyRelation<SelfEntity> extends AbstractRelation<SelfEntity> {
if (targetObjects == null) { if (targetObjects == null) {
continue; continue;
} }
//noinspection unchecked
collection.addAll(targetObjects); collection.addAll(targetObjects);
} }
} }
relationFieldWrapper.set(collection, selfEntity);
relationFieldWrapper.set(collection, selfEntity);
} }
} }

View File

@ -305,15 +305,17 @@ CREATE TABLE `tb_user_order`
INSERT INTO `tb_user_order` INSERT INTO `tb_user_order`
VALUES (1, 1); VALUES (1, 1);
INSERT INTO `tb_user_order` INSERT INTO `tb_user_order`
VALUES (2, 3);
INSERT INTO `tb_user_order`
VALUES (2, 2); VALUES (2, 2);
INSERT INTO `tb_user_order` INSERT INTO `tb_user_order`
VALUES (3, 6); VALUES (2, 3);
INSERT INTO `tb_user_order`
VALUES (3, 4);
INSERT INTO `tb_user_order` INSERT INTO `tb_user_order`
VALUES (3, 5); VALUES (3, 5);
INSERT INTO `tb_user_order` INSERT INTO `tb_user_order`
VALUES (3, 4); VALUES (3, 6);
-- ---------------------------- -- ----------------------------
-- Table structure for tb_user_role -- Table structure for tb_user_role