当前使用版本(必填,否则不予处理)

3.4.1

该问题是如何引起的?(确定最新版也有问题再提!!!)

多租户解析器不能处理select item带子查询的语句,形如select t1.col1,(select t2.col2 where t1.col1=t2.col1) from t1

重现步骤(如果有就写完整)

报错信息

Comment From: ZhouLiDong

我也提了个类似的问题。然后被作者叫去找jsqlparser。 然后我再去看了下mybatis plus多租户的介绍,文档那说“自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)”。。。所以是jsqlparser不支持非标准的sql吧。。

Comment From: weaselveehuang

我已经自己改源码解决了,估计mp团队不打算支持这个特性

------------------ 原始邮件 ------------------ 发件人: "ZhouLiDong"<notifications@github.com>; 发送时间: 2020年12月4日(星期五) 下午2:31 收件人: "baomidou/mybatis-plus"<mybatis-plus@noreply.github.com>; 抄送: "黄伟"<402841291@qq.com>; "Author"<author@noreply.github.com>; 主题: Re: [baomidou/mybatis-plus] 多租户解析器不能处理select item带子查询的语句,形如select t1.col1,(select t2.col2 where t1.col1=t2.col1) from t1 (#3087)

我也提了个类似的问题。然后被作者叫去找jsqlparser。 然后我再去看了下mybatis plus多租户的介绍,文档那说“自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)”。。。所以是jsqlparser不支持非标准的sql吧。。

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

Comment From: shinelon

我已经自己改源码解决了,估计mp团队不打算支持这个特性 ------------------ 原始邮件 ------------------ 发件人: "ZhouLiDong"<notifications@github.com>; 发送时间: 2020年12月4日(星期五) 下午2:31 收件人: "baomidou/mybatis-plus"<mybatis-plus@noreply.github.com>; 抄送: "黄伟"<402841291@qq.com>; "Author"<author@noreply.github.com>; 主题: Re: [baomidou/mybatis-plus] 多租户解析器不能处理select item带子查询的语句,形如select t1.col1,(select t2.col2 where t1.col1=t2.col1) from t1 (#3087) 我也提了个类似的问题。然后被作者叫去找jsqlparser。 然后我再去看了下mybatis plus多租户的介绍,文档那说“自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)”。。。所以是jsqlparser不支持非标准的sql吧。。 — You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub, or unsubscribe.

您好,我也遇见相同问题,我可以参看您写的代码么?

Comment From: weaselveehuang

修改TenantLineInnerInterceptor.java

添加

// 源码修改start:处理selectItems

    /**
     * 处理联接语句
     */
    protected void processSelectItem(SelectItem selectItem) {
        if (selectItem instanceof SelectExpressionItem) {
            SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
            if (selectExpressionItem.getExpression() instanceof SubSelect) {
                processSelectBody(((SubSelect) selectExpressionItem.getExpression()).getSelectBody());
            } else if (selectExpressionItem.getExpression() instanceof Function) {
                ExpressionList parameters = ((Function) selectExpressionItem.getExpression()).getParameters();
                if (ObjectUtil.isNotNull(parameters)) {
                    parameters.getExpressions().forEach(expression -> {
                        if (expression instanceof SubSelect) {
                            processSelectBody(((SubSelect) expression).getSelectBody());
                        }
                    });
                }
            }
        }
    }
    // 源码修改end:处理selectItems

修改

/**
     * 处理 PlainSelect
     */
    protected void processPlainSelect(PlainSelect plainSelect) {
        FromItem fromItem = plainSelect.getFromItem();
        Expression where = plainSelect.getWhere();
        processWhereSubSelect(where);
        if (fromItem instanceof Table) {
            Table fromTable = (Table) fromItem;
            if (!tenantLineHandler.ignoreTable(fromTable.getName())) {
                //#1186 github
                plainSelect.setWhere(builderExpression(where, fromTable));
            }
        } else {
            processFromItem(fromItem);
        }

        // 源码修改start:处理selectItems
        List<SelectItem> selectItems = plainSelect.getSelectItems();
        if (selectItems != null && selectItems.size() > 0) {
            selectItems.forEach(j -> {
                processSelectItem(j);
            });
        }
        // 源码修改end:处理selectItems
        List<Join> joins = plainSelect.getJoins();
        if (joins != null && joins.size() > 0) {
            joins.forEach(j -> {
                processJoin(j);
                processFromItem(j.getRightItem());
            });
        }
    }

Comment From: shinelon

修改TenantLineInnerInterceptor.java

添加

``` // 源码修改start:处理selectItems

/**
 * 处理联接语句
 */
protected void processSelectItem(SelectItem selectItem) {
    if (selectItem instanceof SelectExpressionItem) {
        SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
        if (selectExpressionItem.getExpression() instanceof SubSelect) {
            processSelectBody(((SubSelect) selectExpressionItem.getExpression()).getSelectBody());
        } else if (selectExpressionItem.getExpression() instanceof Function) {
            ExpressionList parameters = ((Function) selectExpressionItem.getExpression()).getParameters();
            if (ObjectUtil.isNotNull(parameters)) {
                parameters.getExpressions().forEach(expression -> {
                    if (expression instanceof SubSelect) {
                        processSelectBody(((SubSelect) expression).getSelectBody());
                    }
                });
            }
        }
    }
}
// 源码修改end:处理selectItems

```

修改

``` /* * 处理 PlainSelect / protected void processPlainSelect(PlainSelect plainSelect) { FromItem fromItem = plainSelect.getFromItem(); Expression where = plainSelect.getWhere(); processWhereSubSelect(where); if (fromItem instanceof Table) { Table fromTable = (Table) fromItem; if (!tenantLineHandler.ignoreTable(fromTable.getName())) { //#1186 github plainSelect.setWhere(builderExpression(where, fromTable)); } } else { processFromItem(fromItem); }

    // 源码修改start:处理selectItems
    List<SelectItem> selectItems = plainSelect.getSelectItems();
    if (selectItems != null && selectItems.size() > 0) {
        selectItems.forEach(j -> {
            processSelectItem(j);
        });
    }
    // 源码修改end:处理selectItems
    List<Join> joins = plainSelect.getJoins();
    if (joins != null && joins.size() > 0) {
        joins.forEach(j -> {
            processJoin(j);
            processFromItem(j.getRightItem());
        });
    }
}

```

十分感谢

Comment From: huayanYu

已参考写入源码,建议后续提交PR参与。