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

cn.org.atool.fluent.mybatis.segment.JoinQuery Maven / Gradle / Ivy

package cn.org.atool.fluent.mybatis.segment;

import cn.org.atool.fluent.mybatis.base.IEntity;
import cn.org.atool.fluent.mybatis.base.IRefs;
import cn.org.atool.fluent.mybatis.base.crud.*;
import cn.org.atool.fluent.mybatis.metadata.DbType;
import cn.org.atool.fluent.mybatis.metadata.JoinType;
import cn.org.atool.fluent.mybatis.segment.model.PagedOffset;
import cn.org.atool.fluent.mybatis.segment.model.Parameters;
import cn.org.atool.fluent.mybatis.utility.MybatisUtil;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 联合查询条件
 *
 * @param 
 */
@SuppressWarnings({"rawtypes", "unused", "unchecked"})
@Accessors(chain = true)
public class JoinQuery>
    extends BaseWrapper, JoinQuery>
    implements IBaseQuery>, JoinBuilder1 {
    /**
     * 主查询类型
     */
    private final Class queryClass;
    /**
     * 主查询条件
     */
    private final QL query;
    /**
     * join查询, 允许有多个join
     */
    private final List queries = new ArrayList<>();

    /**
     * 别名列表
     */
    private final List alias = new ArrayList<>(8);

    @Override
    public String[] getAlias() {
        return this.alias.toArray(new String[0]);
    }

    /**
     * 如果有必要,需要显式设置query表别名
     *
     * @param query 左查询
     */
    public JoinQuery(QL query) {
        super(null);
        this.assertQueryAlias(query);
        this.query = query;
        Parameters parameters = new Parameters();
        this.query.sharedParameter(parameters);
        this.queryClass = (Class) query.getClass();
        super.wrapperData = new JoinWrapperData(this.query, this.queries, parameters);
        this.alias.add(this.query.tableAlias);
    }

    @Override
    public > JoinOn> join(QR query) {
        return join(JoinType.Join, query);
    }

    @Override
    public > JoinOn> leftJoin(QR query) {
        return join(JoinType.LeftJoin, query);
    }

    @Override
    public > JoinOn> rightJoin(QR query) {
        return join(JoinType.RightJoin, query);
    }

    private > JoinOn> join(
        JoinType joinType, QR query) {
        this.assertQueryAlias(query);
        query.sharedParameter(this.query);

        this.queries.add(query);
        this.alias.add(query.tableAlias);
        return new JoinOn<>(this, this.queryClass, this.query, joinType, (Class) query.getClass(), query);
    }

    /**
     * 判断query查询表别名已经设置
     *
     * @param query 右查询
     * @param   右查询类型
     */
    private > void assertQueryAlias(QR query) {
        MybatisUtil.assertNotNull("query", query);
        if (BaseWrapperHelper.isBlankAlias(query)) {
            String err = String.format("the table alias of join query must be set, " +
                "please use constructor: new %s(String alias)", query.getClass().getSimpleName());
            throw new RuntimeException(err);
        }
    }

    @Override
    public JoinBuilder select(String... columns) {
        for (String column : columns) {
            this.wrapperData.addSelectColumn(column);
        }
        return this;
    }

    @Override
    public JoinQuery distinct() {
        this.wrapperData.setDistinct(true);
        return this;
    }

    @Override
    public JoinQuery limit(int limit) {
        this.wrapperData.setPaged(new PagedOffset(0, limit));
        return this;
    }

    @Override
    public JoinQuery limit(int start, int limit) {
        this.wrapperData.setPaged(new PagedOffset(start, limit));
        return this;
    }

    @Override
    public JoinQuery last(String lastSql) {
        this.wrapperData.last(lastSql);
        return this;
    }

    @Override
    public JoinQuery build() {
        return this;
    }

    @Override
    public JoinQuery selectAll() {
        throw new RuntimeException("not support");
    }

    @Override
    public JoinQuery selectId() {
        throw new RuntimeException("not support");
    }

    /**
     * 查询条件 where ...
     */
    public final JoinQueryWhere where = new JoinQueryWhere(this);

    @Override
    public JoinQueryWhere where() {
        return this.where;
    }

    private static final Map QueryAliasConstructors = new HashMap<>(128);

    private static > Q newQuery(Class queryClass, String alias) {
        try {
            if (!QueryAliasConstructors.containsKey(queryClass)) {
                QueryAliasConstructors.put(queryClass, queryClass.getConstructor(String.class));
            }
            return (Q) QueryAliasConstructors.get(queryClass).newInstance(alias);
        } catch (Exception e) {
            throw new RuntimeException(String.format("new %s(String, ParameterPair) error: %s",
                queryClass.getSimpleName(), e.getMessage()), e);
        }
    }

    @Override
    public JoinWrapperData getWrapperData() {
        return (JoinWrapperData) super.wrapperData;
    }

    @Override
    protected List allFields() {
        List all = new ArrayList<>();
        for (BaseQuery query : this.queries) {
            all.addAll(query.allFields());
        }
        return all;
    }

    @Setter
    private DbType dbType;

    @Override
    public DbType dbType() {
        if (dbType != null) {
            return dbType;
        }
        dbType = this.query.dbType();
        if (dbType != null) {
            return dbType;
        }
        for (IQuery query : this.queries) {
            dbType = ((BaseWrapper) query).dbType();
            if (dbType != null) {
                return dbType;
            }
        }
        dbType = IRefs.instance().defaultDbType();
        return dbType;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy