mybatisplus中EntityWrapper的常用方法
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的包裝類進行查詢,比較方便.
但在昨天工作的過程中發(fā)現一個查詢方法來來回回的出錯,查詢條件與預期不符,最終發(fā)現是一個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屬性,最后發(fā)現了,在執(zhí)行這條語句時,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;發(fā)現問題了吧!
由于addFilterIfNeed只是簡單的語句拼接,所以即使我這一句寫在了一起,照樣給我原樣加上去的,所以導致查詢邏輯錯誤,進而引起查詢條件失效!
解決方案
解決方案很簡單,只要在語句中加上括號即可
.addFilterIfNeed(Util.isEmpty(params.getState()),"(state=1 or state=3 or state=4)")
總結:至此,此次遇到的大坑完整解決,也因此明白EntityWrapper中addFilterIfNeed的實現方式.之前沒發(fā)現這個問題時來來回回改了好多次,都沒有解決問題,直到發(fā)現根源!
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java 垃圾回收機制詳解(動力節(jié)點Java學院整理)
在系統(tǒng)運行過程中,會產生一些無用的對象,這些對象占據著一定的內存,如果不對這些對象清理回收無用對象的內存,可能會導致內存的耗盡,所以垃圾回收機制回收的是內存。下面通過本文給大家詳細介紹java垃圾回收機制,一起學習吧2017-02-02
Mybatis in條件傳參的三種實現方式(直接$,List,[])
這篇文章主要介紹了Mybatis in條件傳參的三種實現方式(直接$,List,[]),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

