[基于项目中的分页查询基本常用情况都是最低2个表关联查询,所以建议MP增加分页方法的join查询,我已经进行了扩展,现提供下扩展思路供参考 1,实体类中添加@TableAlias自定义注解用于获取别名 2,QueryWrapper 中添加protected List joinSqList = new ArrayList<>();用于存储join查询设置 3,增加连接查询对象JoinBean

/ * 连接查询对象 */ public class JoinBean implements Serializable { / * 连接表 / private String joinTableName; / * 连接类型(默认左连接) / private SqlBuilder.Join joinType = SqlBuilder.Join.LEFT; / * 连接表字段 */ private String joinField; / * 主表连接字段 / private String mainField; / * 左表连接别名 / private String joinAlias; /* * 主表连接别名 / private String mainAlias;

public JoinBean(Class mainCls, Class joinCls) {
    TableName joinTable = AnnotationUtils.getAnnotation(joinCls, TableName.class);
    TableAlias mainTableAlias = AnnotationUtils.getAnnotation(mainCls, TableAlias.class);
    TableAlias joinTableAlias = AnnotationUtils.getAnnotation(joinCls, TableAlias.class);
    this.mainAlias = mainTableAlias.value();
    this.joinTableName = joinTable.value();
    this.joinAlias = joinTableAlias.value();
    this.joinField = ReflectionUtils.getTableField(joinCls);
    this.mainField = ReflectionUtils.getTableField(mainCls);
    this.joinType = SqlBuilder.Join.LEFT;
}

public JoinBean(Class mainCls, Class joinCls, String joinField) {
    TableName joinTable = AnnotationUtils.getAnnotation(joinCls, TableName.class);
    TableAlias mainTableAlias = AnnotationUtils.getAnnotation(mainCls, TableAlias.class);
    TableAlias joinTableAlias = AnnotationUtils.getAnnotation(joinCls, TableAlias.class);
    this.mainAlias = mainTableAlias.value();
    this.joinTableName = joinTable.value();
    this.joinAlias = joinTableAlias.value();
    this.joinField = joinField;
    this.mainField = ReflectionUtils.getTableField(mainCls);
}

public JoinBean(Class mainCls, Class joinCls, String joinAlias, String joinField) {
    TableName joinTable = AnnotationUtils.getAnnotation(joinCls, TableName.class);
    TableAlias mainTableAlias = AnnotationUtils.getAnnotation(mainCls, TableAlias.class);
    this.mainAlias = mainTableAlias.value();
    this.joinTableName = joinTable.value();
    this.joinAlias = joinAlias;
    this.joinField = joinField;
    this.mainField = ReflectionUtils.getTableField(mainCls);
}

public String getJoinTableName() {
    return joinTableName;
}

public JoinBean setJoinTableName(String joinTableName) {
    this.joinTableName = joinTableName;
    return this;
}

public SqlBuilder.Join getJoinType() {
    return joinType;
}

public JoinBean setJoinType(SqlBuilder.Join joinType) {
    this.joinType = joinType;
    return this;
}

public String getJoinField() {
    return joinField;
}

public JoinBean setJoinField(String joinField) {
    this.joinField = joinField;
    return this;
}

public String getMainField() {
    return mainField;
}

public JoinBean setMainField(String mainField) {
    this.mainField = mainField;
    return this;
}

public String getJoinAlias() {
    return joinAlias;
}

public JoinBean setJoinAlias(String joinAlias) {
    this.joinAlias = joinAlias;
    return this;
}

public String getMainAlias() {
    return mainAlias;
}

public JoinBean setMainAlias(String mainAlias) {
    this.mainAlias = mainAlias;
    return this;
}

public JoinBean right() {
    this.joinType = SqlBuilder.Join.RIGHT;
    return this;
}

public JoinBean inner() {
    this.joinType = SqlBuilder.Join.INNER;
    return this;
}

public JoinBean full() {
    this.joinType = SqlBuilder.Join.FULL;
    return this;
}

}

4, QueryWrapper 添加createJoin方法]

/**
 * 创建连接查询
 *
 * @param joinCls 要连接查询的表对象
 */
public JoinBean createJoin(Class joinCls) {
    ApiAssert.isNotEmpty("请调用CriteriaQuery(PageListModel pageListModel, Class cls)方法", cls);
    JoinBean joinBean = new JoinBean(cls, joinCls);
    this.joinSqList.add(joinBean);
    return joinBean;
}

/**
 * 创建连接查询
 *
 * @param joinCls   要连接查询的表对象
 * @param joinField 设置连接字段
 */
public JoinBean createJoin(Class joinCls, String joinField) {
    ApiAssert.isNotEmpty("请调用CriteriaQuery(PageListModel pageListModel, Class cls)方法", cls);
    JoinBean joinBean = new JoinBean(cls, joinCls, joinField);
    this.joinSqList.add(joinBean);
    return joinBean;
}


/**
 * 创建连接查询
 *
 * @param joinCls   要连接查询的表对象
 * @param joinAlias 重新链接表别名
 * @param joinField 设置连接字段
 */
public JoinBean createJoin(Class joinCls, String joinAlias, String joinField) {
    ApiAssert.isNotEmpty("请调用CriteriaQuery(PageListModel pageListModel, Class cls)方法", cls);
    JoinBean joinBean = new JoinBean(cls, joinCls, joinAlias, joinField);
    this.joinSqList.add(joinBean);
    return joinBean;
}

4 使用方法,CriteriaQuery是我的自定义对象继承了QueryWrapper CriteriaQuery cq = new CriteriaQuery(pageModel, BusQuotation.class); cq.select(BusQuotation.class, "quotationId", "createTime"); 设置查询字段,使用BusQuotation的别名 cq.like(BusPurchase.class, "purchaseTitle");设置查询条件,切改条件会自动作为查询字段 cq.select(SysCompany.class, "companyName"); cq.createJoin(BusPurchase.class);创建跟BusPurchase表的主键进行join查询默认left cq.createJoin(SysCompany.class).setMainField("purchaseCompanyId"); 创建join并指定join字段 return bizService.pageList(cq); 执行结果 select purchase.purchaseTitle,quotation.createTime,company.companyName,quotation.quotationId from bus_quotation as quotation LEFT JOIN bus_purchase purchase ON quotation.quotationId= purchase.purchaseId LEFT JOIN sys_company company ON quotation.purchaseCompanyId= company.companyId WHERE 1=1 LIMIT 0,10

Comment From: miemieYaho

mp永远不支持join,只推荐xml

Comment From: remember-5

@miemieYaho 为什么呢?

Comment From: qmdx

@miemieYaho 为什么呢?

继续支持下去就是 hibernate 用 mp 还有什么意义?

Comment From: yifanyou

mybatis 的 example 支持join