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 Mybatis對應的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及以上版本中被標記為已過時,具體替代方案,官網已給出(https://baomidou.com/guide/interceptor.html#mybatisplusinterceptor)。

官網替代注解如下:

@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);

參考文檔:

1、https://blog.csdn.net/drose29/article/details/103893228

2、https://blog.csdn.net/qq_39313596/article/details/100943090

3、https://mp.baomidou.com/guide/tenant.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM