1. 程式人生 > 其它 >SpringBoot專案:net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:XXXXX

SpringBoot專案:net.sf.jsqlparser.parser.ParseException: Encountered unexpected token:XXXXX

原文地址

寫在前面

最近開發過程中,在where條件中使用IF函式,在MySQL資料庫中,使用Navicat執行沒有問題,但是執行專案的時候,死活過不去,一直報錯,後來一番折騰找到了解決方案,所以,以防後續再出現類似問題,僅做記錄!

說明:專案為SpringBoot專案,持久化層框架使用的是Mybatis-plus(版本為3.0.7)

1.問題復現

1.1 SQL語句執行結果

1.2 Mapper層對應介面

1.3 Mabyties對應xml

1.4 報錯資訊

2. 問題原因

  針對這個問題,在網上查了相關文件,Mybatis-plus官網說是框架中使用到了多租戶功能,Mybatis-plus 會 進行資料許可權的過濾,但是有些介面,其實並不想被多租戶過濾,所以要對該條sql,進行租戶放行。關於這塊Mybatis-plus官網說明了 SqlParserFilter sql 解析過濾器,當然對這部分感興趣的小夥伴們,可以去Mybatis-plus官網檢視相關原始碼,我這裡就不在具體說明了。

說明:多租戶:多個使用者間使用同一套程式,但每個使用者之間實現資料隔離

3.問題解決

參考Mybatis-plus官網,在Mapper層介面方法上 加入註解

@SqlParser(filter=true)

官網截圖如下

加完註解之後的Mapper層介面方法如下:

@SqlParser(filter = true)
List<EmpWhiteList> getAdminList(@Param("empId") String empId, @Param("timeDate") String timeDate);

加完此註解之後,由於專案的Mybatis-plus版本為3.0.7,所以這裡還要再在application.yml檔案中新增下列配置才能生效

說明:如果Mybatis-plus版本是3.1.1至3.4.0以下版本可以直接 新增此註解 即可,3.1.1以下版本需要新增如下配置:

# 開啟 SQL 解析快取註解生效
mybatis-plus:
  global-config:
    sql-parser-cache: true

mybatis-plus3.4.0及以上版本注意:
@SqlParser(filter = true) 在mybatis-plus最新版本3.4.0及以上版本中被標記為已過時,具體替代方案,官網已給出

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface InterceptorIgnore {
    ...
}

關於此註解官網給出如下使用方法:

鑑於此,如果專案引入的MybatisPlus版本為3.4.0及以上,則多租戶遮蔽某個特定mapper介面的方法,則使用如下解決方案:

@InterceptorIgnore(tenantLine = "true")
List<EmpWhiteList> getAdminList(@Param("empId") String empId, @Param("timeDate") String timeDate);