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的數(shù)據(jù)庫框架,在Service進(jìn)行簡單的單表查詢時一般直接使用EntityWrapper的包裝類進(jìn)行查詢,比較方便.
但在昨天工作的過程中發(fā)現(xiàn)一個查詢方法來來回回的出錯,查詢條件與預(yù)期不符,最終發(fā)現(xiàn)是一個wrapper中使用addFilterIfNeed時粗心導(dǎo)致的大坑!
Service層查詢語句:
EntityWrapper<PayTiXianApplyEntity> ew=new EntityWrapper<PayTiXianApplyEntity>(); ? ? ? ? ew.eq(Util.isNotEmpty(params.getState()), "STATE", params.getState()) ? ? ? ? ? ? ? ? //state不為空,根據(jù)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);
由于需求是,根據(jù)參數(shù)不同使用不同的查詢條件.state為空時需查詢表中所有state符合要求的記錄;state不為空,則根據(jù)state=參數(shù)來查詢.
為了省事,所以直接使用了wrapper,其實在MaBatis中使用條件判斷語句也是可以的.
原因
原因就出在為了省事,使用wrapper的addFilterIfNeed上.
出錯的是這條語句:
.addFilterIfNeed(Util.isEmpty(params.getState()),"state=1 or state=3 or state=4")
由于一開始是直接新建的new EntityWrapper的匿名對象,所以即使是debug也查不出錯誤.為了看清SQL,我新建了一個對象ew,在debug過程中仔細(xì)看他的SQL屬性,最后發(fā)現(xiàn)了,在執(zhí)行這條語句時,SQL只是簡單的語句拼接.
也就是說,當(dāng)我state為null時,這條查詢的語句是:(不能寫完整的語句,部分參數(shù)直接用#{}來代替)
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ā)現(xiàn)問題了吧!
由于addFilterIfNeed只是簡單的語句拼接,所以即使我這一句寫在了一起,照樣給我原樣加上去的,所以導(dǎo)致查詢邏輯錯誤,進(jìn)而引起查詢條件失效!
解決方案
解決方案很簡單,只要在語句中加上括號即可
.addFilterIfNeed(Util.isEmpty(params.getState()),"(state=1 or state=3 or state=4)")
總結(jié):至此,此次遇到的大坑完整解決,也因此明白EntityWrapper中addFilterIfNeed的實現(xiàn)方式.之前沒發(fā)現(xiàn)這個問題時來來回回改了好多次,都沒有解決問題,直到發(fā)現(xiàn)根源!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于SpringBoot+vue實現(xiàn)前后端數(shù)據(jù)加解密
這篇文章主要給大家介紹了基于SpringBoot+vue實現(xiàn)前后端數(shù)據(jù)加解密,文中有詳細(xì)的示例代碼,具有一定的參考價值,感興趣的小伙伴可以自己動手試一試2023-08-08關(guān)于Object中equals方法和hashCode方法判斷的分析
今天小編就為大家分享一篇關(guān)于關(guān)于Object中equals方法和hashCode方法判斷的分析,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01JDK21中虛擬線程到底是什么以及用法總結(jié)(看完便知)
這篇文章主要給大家介紹了關(guān)于JDK21中虛擬線程到底是什么以及用法的相關(guān)資料,虛擬線程是一種輕量化的線程封裝,由jvm直接調(diào)度和管理,反之普通的線程其實是調(diào)用的操作系統(tǒng)的能力,對應(yīng)的是操作系統(tǒng)級的線程,需要的朋友可以參考下2023-12-12IDEA下Servlet可能出現(xiàn)404的一些情況
相信有很多小伙伴遇到報錯都不知道怎么處理,今天特地整理了這篇文章,文中對IDEA下Servlet可能出現(xiàn)404的一些情況作了詳細(xì)的介紹,需要的朋友可以參考下2021-06-06java數(shù)字圖像處理基礎(chǔ)使用imageio寫圖像文件示例
這篇文章主要介紹了Java 2D的圖像處理API,文章討論和提及的API都是基于JDK6的,Java中寫一個圖像文件使用ImageIO對象即可,下面看代碼吧2014-01-01Java中ArrayList與順序表的定義與實現(xiàn)方法
ArrayList是一個實現(xiàn)List接口的類,底層是動態(tài)類型順序表,本質(zhì)也就是數(shù)組,動態(tài)主要體現(xiàn)在它的擴(kuò)容機(jī)制,下面這篇文章主要給大家介紹了關(guān)于Java中ArrayList與順序表的定義與實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2022-07-07