当前使用版本(必填,否则不予处理)
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参与。