首頁 > 軟體

mybatisplus中EntityWrapper的常用方法

2022-03-22 13:00:50

EntityWrapper的常用方法

#WHERE (issue_type = ?) AND (status = ? OR status = ? OR status = ?) 
EntityWrapper wrapper=new EntityWrapper();
        wrapper.eq("issue_type","缺陷").andNew().eq("status","提交").or()
                .eq("status","啟用").or().eq("status","解決");

粗心遇到的EntityWrapper的一個坑

公司專案框架是SpringBoot為主題,整合了MyBatisPlus的資料庫框架,在Service進行簡單的單表查詢時一般直接使用EntityWrapper的包裝類進行查詢,比較方便.

但在昨天工作的過程中發現一個查詢方法來來回回的出錯,查詢條件與預期不符,最終發現是一個wrapper中使用addFilterIfNeed時粗心導致的大坑!

Service層查詢語句:

EntityWrapper<PayTiXianApplyEntity> ew=new EntityWrapper<PayTiXianApplyEntity>();
        ew.eq(Util.isNotEmpty(params.getState()), "STATE", params.getState())
                //state不為空,根據state查詢
                .like(Util.isNotEmpty(params.getTxname()), "TXNAME", params.getTxname())
                .eq(Util.isNotEmpty(params.getTxmode()), "TXMODE", params.getTxmode())
                .like(Util.isNotEmpty(params.getTxserial()), "TXSERIAL", params.getTxserial())
                .addFilterIfNeed(Util.isNotEmpty(txtime), "DATE_FORMAT(TXTIME,'%Y-%m-%d')='" + txtime+"'")
                .addFilterIfNeed(Util.isEmpty(params.getState()),"state=1 or state=3 or state=4")
                //state為空,查詢state為1或2的記錄,即出納人稽核通過和沒通過的記錄
                .orderBy("TXTIME", false);
Page<PayTiXianApplyEntity> page = this.selectPage(
                new Query<PayTiXianApplyEntity>(params).getPage(),ew);

由於需求是,根據引數不同使用不同的查詢條件.state為空時需查詢表中所有state符合要求的記錄;state不為空,則根據state=引數來查詢.

為了省事,所以直接使用了wrapper,其實在MaBatis中使用條件判斷語句也是可以的.

原因

原因就出在為了省事,使用wrapper的addFilterIfNeed上.

出錯的是這條語句:

.addFilterIfNeed(Util.isEmpty(params.getState()),"state=1 or state=3 or state=4")

由於一開始是直接新建的new EntityWrapper的匿名物件,所以即使是debug也查不出錯誤.為了看清SQL,我新建了一個物件ew,在debug過程中仔細看他的SQL屬性,最後發現了,在執行這條語句時,SQL只是簡單的語句拼接.

也就是說,當我state為null時,這條查詢的語句是:(不能寫完整的語句,部分引數直接用#{}來代替)

SELECT * FROM 表名
WHERE TXNAME like #{txname} 
AND TXMODE=#{txmode}
AND TXSERIAL=#{txserial}
AND DATE_FORMAT(TXTIME,'%Y-%m-%d')=#{txtime}
AND state=1 or state=3 or state=4
ORDER BY TXTIME;

發現問題了吧!

由於addFilterIfNeed只是簡單的語句拼接,所以即使我這一句寫在了一起,照樣給我原樣加上去的,所以導致查詢邏輯錯誤,進而引起查詢條件失效!

解決方案

解決方案很簡單,只要在語句中加上括號即可

.addFilterIfNeed(Util.isEmpty(params.getState()),"(state=1 or state=3 or state=4)")

總結:至此,此次遇到的大坑完整解決,也因此明白EntityWrapper中addFilterIfNeed的實現方式.之前沒發現這個問題時來來回回改了好多次,都沒有解決問題,直到發現根源!

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com