mybatis-plus 多租户 lef join bug 会重复on导致sql语句报错

589 阅读1分钟

问题描述

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.13</version>
</dependency>

<dependency>
   <groupId>com.baomidou</groupId>
   <artifactId>mybatis-plus-boot-starter</artifactId>
   <version>3.4.1</version>
</dependency>

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <version>1.4.6</version>
</dependency>

mybatis-plus开启多租户插件功能时,在进行链表查询时会重复出现on导致sql语句报错

  • 原始xml文件中的sql

select t.* from t_role t left join t_user t2 on t.id=t2.id

  • mybatis-plus开启多租户插件功能时解析的sql后,会出现重复On

ON t.id = t2.id AND t2.tenant_id = '1' ON t.id = t2.id

SELECT t.* FROM t_role t LEFT JOIN t_user t2 ON t.id = t2.id AND t2.tenant_id = '1' ON t.id = t2.id
WHERE t.tenant_id = '1'

原因分析

原因是引入的分页拆件中的jsqlparser解析器和mybatis-plus的jsqlparser解析器冲突了,导致默认采用了分页拆件的jsqlparser解析器

image.png

分页拆件中的jsqlparser解析器,在处理left join on表达式是这样的

image.png

mybatis-plus的jsqlparser解析器,在处理left join on表达式是这样的

image.png

解决办法

image.png

排除pagehelper-spring-boot-starter的jar中的jsqlparser依赖

<dependency>
   <groupId>com.github.pagehelper</groupId>
   <artifactId>pagehelper-spring-boot-starter</artifactId>
   <exclusions>
      <exclusion>
         <artifactId>mybatis-spring</artifactId>
         <groupId>org.mybatis</groupId>
      </exclusion>
      <exclusion>
         <artifactId>mybatis</artifactId>
         <groupId>org.mybatis</groupId>
      </exclusion>
      <exclusion>
         <groupId>com.github.jsqlparser</groupId>
         <artifactId>jsqlparser</artifactId>
      </exclusion>
      
   </exclusions>
</dependency>