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

org.zodiac.mybatisplus.binding.binder.remote.RemoteBindQueryExecutor Maven / Gradle / Ivy

There is a newer version: 1.6.8
Show newest version
package org.zodiac.mybatisplus.binding.binder.remote;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zodiac.commons.api.R;
import org.zodiac.commons.api.ResultCodeEnum;
import org.zodiac.commons.util.BeanUtil;
import org.zodiac.commons.util.Colls;
import org.zodiac.commons.util.serialize.JsonUtil;
import org.zodiac.mybatisplus.base.BaseService;
import org.zodiac.mybatisplus.binding.cache.BindingCacheManager;
import org.zodiac.mybatisplus.binding.helper.WrapperHelper;
import org.zodiac.mybatisplus.binding.parser.PropInfo;
import org.zodiac.mybatisplus.util.MyBatisPlusSpringBootUtil;
import org.zodiac.mybatisplus.util.MyBatisPlusUtil;
import org.zodiac.sdk.toolkit.util.ClassLoaderUtil;

/**
 * 远程绑定查询执行器。
 * 
 */
public class RemoteBindQueryExecutor {

    private static Logger log = LoggerFactory.getLogger(RemoteBindQueryExecutor.class);

    private RemoteBindQueryExecutor() {
        super();
    }

    /**
     * 执行查询返回绑定数据。
     * 
     * @param remoteBindDTO 绑定DTO
     * @return 结果
     */
    public static R execute(RemoteBindDTO remoteBindDTO) {
        Class entityClass = null;
        try {
            entityClass = ClassLoaderUtil.loadClass(remoteBindDTO.getEntityClassName());
        } catch (Exception e) {
            String msg = "模块下无Entity类: " + remoteBindDTO.getEntityClassName();
            log.error(msg, e);
            return R.fail(ResultCodeEnum.PARAM_VALID_ERROR, msg);
        }
        Collection inConditionValues = remoteBindDTO.getInConditionValues();
        if (inConditionValues == null) {
            return R.success();
        }
        if (inConditionValues.isEmpty()) {
            return R.successWithData(Collections.emptyList());
        }
        /*关联主键列名。*/
        String refJoinCol = remoteBindDTO.getRefJoinCol();
        PropInfo propInfo = BindingCacheManager.getPropInfoByClass(entityClass);
        Class idFieldType = propInfo.getFieldTypeByColumn(refJoinCol);
        Collection formatInValues = BeanUtil.convertIdValuesToType(inConditionValues, idFieldType);
        /*构建queryWrpper。*/
        QueryWrapper queryWrapper = new QueryWrapper<>();
        queryWrapper.setEntityClass(entityClass);
        queryWrapper.select(remoteBindDTO.getSelectColumns());
        /*构建查询条件。*/
        queryWrapper.in(refJoinCol, formatInValues);
        queryWrapper.and(Colls.notEmptyColl(remoteBindDTO.getAdditionalConditions()),
            e -> remoteBindDTO.getAdditionalConditions().forEach(e::apply));
        /*排序。*/
        WrapperHelper.buildOrderBy(queryWrapper, remoteBindDTO.getOrderBy(), e -> e);
        /*执行查询返回结果List。*/
        try {
            String jsonStr = null;
            if ("Map".equals(remoteBindDTO.getResultType())) {
                List> resultMap = getMapList(entityClass, queryWrapper);
                jsonStr = JsonUtil.toJsonString(resultMap);
            } else if ("Entity".equals(remoteBindDTO.getResultType())) {
                List resultList = getEntityList(entityClass, queryWrapper);
                jsonStr = JsonUtil.toJsonString(resultList);
            }
            return R.successWithData(jsonStr);
        } catch (Exception e) {
            log.error("绑定查询执行异常", e);
            return R.fail(ResultCodeEnum.INTERNAL_SERVER_ERROR, "绑定查询执行异常: " + e.getMessage());
        }
    }

    /**
     * 获取Map结果。
     * 
     * @param entityClass 实体类型
     * @param queryWrapper 条件
     * @return 结果列表
     */
    private static List> getMapList(Class entityClass, Wrapper queryWrapper) {
        IService referencedService = MyBatisPlusUtil.getIServiceByEntity(entityClass);
        if (referencedService instanceof BaseService) {
            return ((BaseService)referencedService).getMapList(queryWrapper);
        } else {
            List> list = referencedService.listMaps(queryWrapper);
            return checkedList(list);
        }
    }

    /**
     * 获取EntityList。
     * 
     * @param  实体类型
     * @param entityClass 实体类型
     * @param queryWrapper 条件
     * @return 结果列表
     */
    private static  List getEntityList(Class entityClass, Wrapper queryWrapper) {
        IService referencedService = MyBatisPlusUtil.getIServiceByEntity(entityClass);
        if (referencedService instanceof BaseService) {
            return ((BaseService)referencedService).getEntityList(queryWrapper);
        } else {
            List list = referencedService.list(queryWrapper);
            return checkedList(list);
        }
    }

    /**
     * 检查list,结果过多打印warn。
     * 
     * @param list 检查的对象列表
     * @return 结果
     */
    private static List checkedList(List list) {
        if (list == null) {
            list = Collections.emptyList();
        } else if (list.size() > MyBatisPlusSpringBootUtil.getBatchSize()) {
            log.warn("单次查询记录数量过大,返回结果数={},请检查!", list.size());
        }
        return list;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy