![JAR search and dependency download from the Maven repository](/logo.png)
org.zodiac.mybatisplus.binding.binder.EntityBinder Maven / Gradle / Ivy
package org.zodiac.mybatisplus.binding.binder;
import org.zodiac.commons.util.BeanUtil;
import org.zodiac.commons.util.Colls;
import org.zodiac.commons.util.lang.Strings;
import org.zodiac.core.exception.IllegalUsageException;
import org.zodiac.mybatisplus.binding.annotation.BindEntity;
import org.zodiac.mybatisplus.binding.binder.remote.RemoteBindingManager;
import org.zodiac.mybatisplus.binding.helper.ResultAssembler;
import org.zodiac.mybatisplus.binding.helper.WrapperHelper;
import org.zodiac.sdk.toolkit.function.Setter;
import org.zodiac.sdk.toolkit.util.collection.CollAndMapUtil;
import org.zodiac.sdk.toolkit.util.lang.StrUtil;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Entity实体绑定Binder,用于绑定当前一个entity到目标对象的属性。
*
*/
public class EntityBinder extends BaseBinder {
/***
* 给待绑定list中VO对象赋值的setter属性名
*/
protected String annoObjectField;
/***
* 给待绑定list中VO对象赋值的setter属性class类型
*/
protected Class> annoObjectFieldClass;
public EntityBinder(Class entityClass, List voList) {
super(entityClass, voList);
}
public EntityBinder(BindEntity annotation, List voList) {
super(annotation.entity(), voList);
}
/***
* 指定VO绑定属性赋值的setter方法。
*
* @param VO类型
* @param set方法参数类型
* @param voSetter VO中调用赋值的setter方法
* @param annoObjectFieldClass VO中调用赋值的setter属性类型
* @return 结果
*/
public BaseBinder set(Setter voSetter, Class annoObjectFieldClass) {
return set(BeanUtil.convertToFieldName(voSetter), annoObjectFieldClass);
}
/***
* 指定VO绑定属性赋值的set属性。
*
* @param annoObjectField VO中调用赋值的setter属性
* @param annoObjectFieldClass VO中调用赋值的setter属性类型
* @return 结果
*/
public BaseBinder set(String annoObjectField, Class annoObjectFieldClass) {
this.annoObjectField = toAnnoObjField(annoObjectField);
this.annoObjectFieldClass = annoObjectFieldClass;
return this;
}
@Override
public void bind() {
if (Colls.emptyColl(annoObjectList)) {
return;
}
if (Colls.emptyColl(refObjJoinCols)) {
throw new IllegalUsageException("调用错误:无法从condition中解析出字段关联.");
}
if (middleTable == null) {
/*直接关联Entity。*/
this.simplifySelectColumns();
// @BindEntity(entity = Department.class, condition="this.department_id=id AND this.type=type")
// Department department;
super.buildQueryWrapperJoinOn();
/*查询条件为空时不进行查询。*/
if (queryWrapper.isEmptyOfNormal()) {
return;
}
List entityList = null;
/*查询entity列表: List。*/
if (StrUtil.isBlank(this.module)) {
/*本地查询获取匹配结果的entityList。*/
entityList = getEntityList(queryWrapper);
} else {
/*远程调用获取。*/
entityList = RemoteBindingManager.fetchEntityList(module, remoteBindDTO, referencedEntityClass);
}
if (Colls.notEmptyColl(entityList)) {
Map valueEntityMap = this.buildMatchKey2EntityMap(entityList);
ResultAssembler.bindPropValue(annoObjectField, super.getMatchedAnnoObjectList(), getAnnoObjJoinFlds(),
valueEntityMap, null);
}
} else {
/*通过中间表关联Entity。*/
if (refObjJoinCols.size() > 1) {
throw new IllegalUsageException(NOT_SUPPORT_MSG);
}
/*提取注解条件中指定的对应的列表。*/
Map trunkObjCol2ValuesMap = super.buildTrunkObjCol2ValuesMap();
Map middleTableResultMap = middleTable.executeOneToOneQuery(trunkObjCol2ValuesMap);
if (Colls.emptyMap(middleTableResultMap)) {
return;
}
/*结果转换Map。*/
Map valueEntityMap = CollAndMapUtil.map();
this.simplifySelectColumns();
/*提取entity主键值集合。*/
Collection refObjValues = middleTableResultMap.values().stream().distinct().collect(Collectors.toList());
/*构建查询条件*/
String refObjJoinOnCol = refObjJoinCols.get(0);
/*查询entity列表*/
List entityList = null;
/*查询entity列表: List。*/
if (StrUtil.isBlank(this.module)) {
queryWrapper.in(refObjJoinOnCol, refObjValues);
/*本地查询获取匹配结果的entityList。*/
entityList = getEntityList(queryWrapper);
} else {
/*远程调用获取。*/
remoteBindDTO.setRefJoinCol(refObjJoinOnCol).setInConditionValues(refObjValues);
entityList = RemoteBindingManager.fetchEntityList(module, remoteBindDTO, referencedEntityClass);
}
if (Colls.emptyColl(entityList)) {
return;
}
String refObjJoinOnField = toRefObjField(refObjJoinOnCol);
/*转换entity列表为Map*/
Map listMap = BeanUtil.convertToStringKeyObjectMap(entityList, refObjJoinOnField);
if (Colls.notEmptyMap(listMap)) {
// List joinOnValues = new ArrayList<>(refObjJoinFlds.size());
for (Map.Entry entry : middleTableResultMap.entrySet()) {
Object fetchValueId = entry.getValue();
if (fetchValueId == null) {
continue;
}
String key = entry.getKey();
T entity = listMap.get(String.valueOf(fetchValueId));
valueEntityMap.put(key, cloneOrConvertBean(entity));
}
}
/*绑定结果*/
ResultAssembler.bindEntityPropValue(annoObjectField, super.getMatchedAnnoObjectList(),
middleTable.getTrunkObjColMapping(), valueEntityMap, getAnnoObjColumnToFieldMap());
}
}
/**
* 构建匹配key-entity目标的map。
*
* @param list 实体列表
* @return 匹配的映射关系
*/
private Map buildMatchKey2EntityMap(List list) {
Map key2TargetMap = CollAndMapUtil.map(list.size());
StringBuilder sb = new StringBuilder();
for (T entity : list) {
sb.setLength(0);
for (int i = 0; i < refObjJoinCols.size(); i++) {
String refObjJoinOnCol = refObjJoinCols.get(i);
String pkValue = BeanUtil.getStringProperty(entity, toRefObjField(refObjJoinOnCol));
if (i > 0) {
sb.append(Strings.COMMA);
}
sb.append(pkValue);
}
/*查找匹配Key*/
String matchKey = sb.toString();
Object target = entity;
if (target instanceof Map == false) {
target = cloneOrConvertBean(entity);
}
key2TargetMap.put(matchKey, target);
}
sb.setLength(0);
return key2TargetMap;
}
/**
* 克隆Entity/VO对象(如果与Entity类型不一致,如VO则先转型)。
*
* @param value 被克隆的对象
* @return 结果
*/
protected Object cloneOrConvertBean(T value) {
if (value == null) {
return value;
}
if (value.getClass().getName().equals(annoObjectFieldClass.getName())) {
return BeanUtil.cloneBean(value);
} else {
return BeanUtil.convert(value, annoObjectFieldClass);
}
}
/**
* 简化select列,仅select必需列。
*/
@Override
protected void simplifySelectColumns() {
if (!referencedEntityClass.getName().equals(annoObjectFieldClass.getName())) {
WrapperHelper.optimizeSelect(queryWrapper, referencedEntityClass, annoObjectFieldClass);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy