![JAR search and dependency download from the Maven repository](/logo.png)
org.zodiac.mybatisplus.binding.binder.FieldBinder Maven / Gradle / Ivy
package org.zodiac.mybatisplus.binding.binder;
import org.springframework.beans.BeanWrapper;
import org.zodiac.commons.support.SpringContextHolder;
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.BindField;
import org.zodiac.mybatisplus.binding.binder.remote.RemoteBindingManager;
import org.zodiac.sdk.toolkit.function.Getter;
import org.zodiac.sdk.toolkit.function.Setter;
import org.zodiac.sdk.toolkit.util.lang.StrUtil;
import java.util.*;
import java.util.stream.Collectors;
/**
* 关联字段绑定。
*
*/
public class FieldBinder extends BaseBinder {
/**
* VO对象绑定赋值的属性名列表
*/
protected List annoObjectSetterPropNameList;
/**
* DO/Entity对象对应的getter取值属性名列表
*/
protected List referencedGetterFieldNameList;
public FieldBinder(Class entityClass, List voList) {
super(entityClass, voList);
}
public FieldBinder(BindField annotation, List voList) {
super(annotation.entity(), voList);
}
/***
* 指定VO绑定属性赋值的setter和DO/Entity取值的getter方法。
*
* @param VO类型
* @param DO类型
* @param set方法参数类型
* @param fromDoGetter VO中调用赋值的getter值来源
* @param toVoSetter VO中调用赋值的setter方法
* @return 结果
*/
public FieldBinder link(Getter fromDoGetter, Setter toVoSetter) {
return link(BeanUtil.convertToFieldName(fromDoGetter), BeanUtil.convertToFieldName(toVoSetter));
}
/***
* 指定VO绑定赋值的setter属性名和DO/Entity取值的getter属性名。
*
* @param fromDoField VO中调用赋值的setter值来源
* @param toVoField VO中调用赋值的setter属性名
* @return 结果
*/
public FieldBinder link(String fromDoField, String toVoField) {
if (annoObjectSetterPropNameList == null) {
annoObjectSetterPropNameList = new ArrayList<>(4);
}
annoObjectSetterPropNameList.add(toVoField);
if (referencedGetterFieldNameList == null) {
referencedGetterFieldNameList = new ArrayList<>(4);
}
referencedGetterFieldNameList.add(fromDoField);
return this;
}
@Override
public void bind() {
if (Colls.emptyColl(annoObjectList)) {
return;
}
if (Colls.emptyColl(refObjJoinCols)) {
throw new IllegalUsageException("调用错误:无法从condition中解析出字段关联.");
}
if (referencedGetterFieldNameList == null) {
throw new IllegalUsageException("调用错误:字段绑定必须指定字段field");
}
// 直接关联
if (middleTable == null) {
this.simplifySelectColumns();
super.buildQueryWrapperJoinOn();
/*查询条件为空时不进行查询。*/
if (queryWrapper.isEmptyOfNormal()) {
return;
}
List entityList = null;
if (StrUtil.isBlank(this.module)) {
/*本地查询获取匹配结果的entityList。*/
entityList = getEntityList(queryWrapper);
} else {
/*远程调用获取。*/
entityList = RemoteBindingManager.fetchEntityList(module, remoteBindDTO, referencedEntityClass);
}
if (Colls.emptyColl(entityList)) {
return;
}
/*将结果list转换成entityMap。*/
Map key2EntityMap = this.buildMatchKey2EntityMap(entityList);
/*遍历list并赋值*/
for (Object annoObject : super.getMatchedAnnoObjectList()) {
String matchKey = buildMatchKey(annoObject);
setFieldValueToTrunkObj(key2EntityMap, annoObject, matchKey);
}
} else {
if (refObjJoinCols.size() > 1) {
throw new IllegalUsageException(NOT_SUPPORT_MSG);
}
/*提取注解条件中指定的对应的列表。*/
Map trunkObjCol2ValuesMap = super.buildTrunkObjCol2ValuesMap();
/*中间表查询结果map。*/
Map middleTableResultMap = middleTable.executeOneToOneQuery(trunkObjCol2ValuesMap);
if (Colls.emptyMap(middleTableResultMap)) {
return;
}
/*收集查询结果values集合。*/
Collection refObjValues = middleTableResultMap.values().stream().distinct().collect(Collectors.toList());
this.simplifySelectColumns();
/*构建查询条件*/
String refObjJoinOnCol = refObjJoinCols.get(0);
/*获取匹配结果的mapList。*/
List entityList = null;
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;
}
/*将结果list转换成entityMap。*/
Map key2EntityMap = this.buildMatchKey2EntityMap(entityList);
/*遍历list并赋值。*/
for (Object annoObject : super.getMatchedAnnoObjectList()) {
String matchKey = buildMatchKey(annoObject, middleTableResultMap);
setFieldValueToTrunkObj(key2EntityMap, annoObject, matchKey);
}
}
}
/**
* 设置字段值。
*
* @param key2EntityMap 实体对象列表
* @param annoObject 对象
* @param matchKey 匹配的key
*/
private void setFieldValueToTrunkObj(Map key2EntityMap, Object annoObject, String matchKey) {
T relationEntity = key2EntityMap.get(matchKey);
if (relationEntity != null) {
BeanWrapper beanWrapper = SpringContextHolder.getBeanWrapper(annoObject);
for (int i = 0; i < annoObjectSetterPropNameList.size(); i++) {
Object valObj = BeanUtil.getProperty(relationEntity, referencedGetterFieldNameList.get(i));
beanWrapper.setPropertyValue(annoObjectSetterPropNameList.get(i), valObj);
}
}
}
/**
* 构建匹配key-entity目标的map。
*
* @param entityList 实体对象列表
* @return 结果
*/
protected Map buildMatchKey2EntityMap(List entityList) {
Map key2TargetMap = new HashMap<>(entityList.size());
for (T entity : entityList) {
List joinOnValues = new ArrayList<>(refObjJoinCols.size());
for (String refObjJoinOnCol : refObjJoinCols) {
Object valObj = BeanUtil.getProperty(entity, toRefObjField(refObjJoinOnCol));
joinOnValues.add(StrUtil.stringValueOf(valObj));
}
String matchKey = Strings.join(joinOnValues);
if (matchKey != null) {
key2TargetMap.put(matchKey, entity);
}
}
return key2TargetMap;
}
/**
* 构建匹配Key。
*
* @param annoObject 对象
* @return 结果
*/
private String buildMatchKey(Object annoObject) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < annoObjJoinCols.size(); i++) {
String col = annoObjJoinCols.get(i);
/*将数子类型转换成字符串,以便解决类型不一致的问题*/
String val = BeanUtil.getStringProperty(annoObject, toAnnoObjField(col));
if (i > 0) {
sb.append(Strings.COMMA);
}
sb.append(val);
}
return sb.toString();
}
/**
* 构建匹配Key。
*
* @param annoObject 对象
* @param middleTableResultMap 中间表结果集
* @return 结果
*/
private String buildMatchKey(Object annoObject, Map middleTableResultMap) {
StringBuilder sb = new StringBuilder();
boolean appendComma = false;
for (Map.Entry entry : middleTable.getTrunkObjColMapping().entrySet()) {
String getterField = toAnnoObjField(entry.getKey());
String fieldValue = BeanUtil.getStringProperty(annoObject, getterField);
/*通过中间结果Map转换得到OrgId*/
if (Colls.notEmptyMap(middleTableResultMap)) {
Object value = getValueIgnoreKeyCase(middleTableResultMap, fieldValue);
fieldValue = String.valueOf(value);
}
if (appendComma) {
sb.append(Strings.COMMA);
}
sb.append(fieldValue);
if (appendComma == false) {
appendComma = true;
}
}
/*查找匹配Key*/
return sb.toString();
}
@Override
protected void simplifySelectColumns() {
List selectColumns = new ArrayList<>(8);
selectColumns.addAll(refObjJoinCols);
if (Colls.notEmptyColl(referencedGetterFieldNameList)) {
for (String referencedGetterField : referencedGetterFieldNameList) {
String refObjCol = toRefObjColumn(referencedGetterField);
if (!selectColumns.contains(refObjCol)) {
selectColumns.add(refObjCol);
}
}
}
/*添加orderBy排序。*/
if (StrUtil.isNotBlank(this.orderBy)) {
/*解析排序。*/
String[] orderByFields = StrUtil.splitToArray(this.orderBy);
for (String field : orderByFields) {
String colName = field.toLowerCase();
if (colName.contains(":")) {
colName = Strings.split(colName, ":")[0];
}
colName = toRefObjColumn(colName);
if (!selectColumns.contains(colName)) {
selectColumns.add(colName);
}
}
}
String[] selectColsArray = Strings.toStringArray(selectColumns);
if (remoteBindDTO != null) {
remoteBindDTO.setSelectColumns(selectColsArray);
}
this.queryWrapper.select(selectColsArray);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy