All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zodiac.mybatisplus.binding.binder.FieldBinder Maven / Gradle / Ivy

There is a newer version: 1.6.8
Show newest version
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