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