mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
refactor: optimize ToManyRelation.java
This commit is contained in:
parent
69216d926e
commit
5a5dd3c0ec
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user