版本
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
当前最新版本3.5.3.1
查看依赖可已发现该版本下的jsqlparser为4.4
警告原文
2023-02-24 15:54:37.446 WARN ,,,] [http-nio-9123-exec-1] com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor:360 :optimize this sql to a count sql has exception, sql:"select *
from ees_user_info eui
left join ees_empl_info eee on eui.id = eee.user_id
left join user_role ur on eui.id = ur.user_id", exception:
net.sf.jsqlparser.parser.ParseException: Encountered unexpected token: "," ","
at line 1, column 50.
Was expecting one of:
")"
"CONNECT"
"EMIT"
"EXCEPT"
"GROUP"
"HAVING"
"INTERSECT"
"INTO"
"MINUS"
"START"
"UNION"
"WINDOW"
问题排查
经排查发现该警告来自于jsqlparser包下的 CCJSqlParserUtil.parse(sql)方法报的ParseException。
于是测试代码如下
//此处jsqlparser包的版本为4.4
public static void main(String[] args) {
String sql = "select *\n" +
"from ees_user_info eui\n" +
" left join ees_empl_info eee on eui.id = eee.user_id\n" +
" left join user_role ur on eui.id = ur.user_id";
try {
Select select = (Select) CCJSqlParserUtil.parse(sql);
} catch (JSQLParserException e) {
e.printStackTrace();
}
}
解决
发现jsqlparser最新的包为4.6于是修改pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus-boot-version}</version>
<exclusions>
<!-- 3.5.2版本mp中4.4版本的jsqlparser在做分页拦截器的join优化时解析mysql多个左连接的sql时会报错已排除该包,采用4.6-->
<exclusion>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.6</version>
</dependency>
一开始以为是多层left join的问题,后续发现是因为jsqlparser4.4不支持 cs、ur、uu等 隔离级别的关键字导致的报错!
关联issue建议升级mp的jsqlparser版本,否则多个left join sql 在分页插件join优化时会一直报警告