sql中and和or的混合使用征讲,以及在spring,jpa橡娄,Specification中的寫法

在開發(fā)過程遇到一個需求诗箍,查詢篩選框中存在兩種可傳入字段:多選字段和手動輸入,根據(jù)傳入的字符串?dāng)?shù)組和手動輸入對數(shù)據(jù)庫的某個字段分別進(jìn)行一次in的精確匹配和like模糊查詢挽唉。

因?yàn)閰?shù)是動態(tài)傳入的滤祖,開始拼裝的sql語句如下

if(GETWAYLIST != null && ! GETWAYLIST.isEmpty() && GETWAY? != null && GETWY != "")

sql="select * from HOUSE where 1=1? ?and?GETWAY? ?in (:GETWAYLIST) and GETWAY like :GETWAY";

GETWAYLIST = Arrays.asList(getWay.sprit(",")//傳入的多選項(xiàng),多個以逗號相隔

這樣寫的問題就是如果兩個條件同時存在瓶籽,其中一個查詢?yōu)榭諘?dǎo)致另外一個條件查詢失敗匠童。

將上述的sql修改后的語句為

select * from HOUSE where?1=1? ?and?GETWAY??in (:GETWAYLIST) or GETWAY like :GETWAY;

但是sql中and的執(zhí)行優(yōu)先度比or的優(yōu)先度高,先執(zhí)行了前面的and邏輯再執(zhí)行后面的or語句塑顺,所以查出來的數(shù)據(jù)并不是我想要的數(shù)據(jù)

最后查閱資料后修改語句為

select * from HOUSE where?1=1? ?and (GETWAY??in (:GETWAYLIST) or GETWAY like :GETWAY);

()的優(yōu)先度比and的要高汤求。



另外項(xiàng)目中用到了springjpa的Specification方法拼裝數(shù)據(jù)庫查詢方法,其中的寫法如下(針對同一參數(shù)不同的查詢類型)

public class HouseSpecification implements Specification<House>{

? ??//篩選條件參數(shù)-證載用途

????String proveUse;

? ??//篩選條件參數(shù)-實(shí)際用途手動輸入

????String proveUseOther;

? ??public HouseSpecification(?String proveUse,?String proveUseOther){

? ??????this.proveUse=proveUse;

? ??????this.proveUseOther=proveUseOther;

????}

? ??@SuppressWarnings("static-access")

????@Override

????public Predicate toPredicate(Root<House> root, CriteriaQuery<?> query, CriteriaBuilder cb)

????{

? ? ? ? ?//證載用途,根據(jù)傳入?yún)?shù)拼裝

? ? ? ? ?if(!CheckUtil.isNullorEmpty(proveUse)&&!CheckUtil.isNullorEmpty(proveUseOther)){

? ? ? ? ?????List<String> proveUseList = Arrays.asList(proveUse.split(","));

? ? ? ? ?????predicates.add(cb.or(cb.and(root.<String>get("proveUse").in(proveUseList)),cb.and(cb.like(root.? <String>get("proveUse"),"%"+proveUseOther+"%"))));

? ? ? ?}

????????else if(!CheckUtil.isNullorEmpty(proveUse)&&CheckUtil.isNullorEmpty(proveUseOther)){

????????????List<String> proveUseList = Arrays.asList(proveUse.split(","));

????????????predicates.add(cb.and(root.<String>get("proveUse").in(proveUseList)));

????????}

????????else if(!CheckUtil.isNullorEmpty(proveUseOther)){

????????????predicates.add(cb.and(cb.like(root.<String>get("proveUse"),"%"+proveUseOther+"%")));

????????}

? ??????return query.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction();

? ?? ???}

}

使用時調(diào)用dao層封裝好的 findAll(new HouseSpecification (proveUse,proveUseOther))

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末首昔,一起剝皮案震驚了整個濱河市寡喝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌勒奇,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巧骚,死亡現(xiàn)場離奇詭異赊颠,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)劈彪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門竣蹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人沧奴,你說我怎么就攤上這事痘括。” “怎么了滔吠?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵纲菌,是天一觀的道長。 經(jīng)常有香客問我疮绷,道長翰舌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任冬骚,我火速辦了婚禮椅贱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘只冻。我一直安慰自己庇麦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布喜德。 她就那樣靜靜地躺著山橄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪住诸。 梳的紋絲不亂的頭發(fā)上驾胆,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機(jī)與錄音贱呐,去河邊找鬼丧诺。 笑死,一個胖子當(dāng)著我的面吹牛奄薇,可吹牛的內(nèi)容都是我干的驳阎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼呵晚!你這毒婦竟也來了蜘腌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤饵隙,失蹤者是張志新(化名)和其女友劉穎撮珠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體金矛,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芯急,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驶俊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娶耍。...
    茶點(diǎn)故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饼酿,靈堂內(nèi)的尸體忽然破棺而出榕酒,到底是詐尸還是另有隱情,我是刑警寧澤故俐,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布想鹰,位于F島的核電站,受9級特大地震影響购披,放射性物質(zhì)發(fā)生泄漏杖挣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一刚陡、第九天 我趴在偏房一處隱蔽的房頂上張望惩妇。 院中可真熱鬧,春花似錦筐乳、人聲如沸歌殃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽氓皱。三九已至,卻和暖如春勃刨,著一層夾襖步出監(jiān)牢的瞬間波材,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工身隐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留廷区,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓贾铝,卻偏偏與公主長得像隙轻,于是被迫代替她去往敵國和親埠帕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 在上學(xué)之前玖绿,喜歡寫一些亂七八糟的東西敛瓷,喜歡寫文章激勵自己,因?yàn)楫?dāng)時的自己多么可憐斑匪,多么無助呐籽,也沒有人能夠理解,父母...
    婉約詞的愛閱讀 200評論 0 0
  • 客房王大姐身邊的事(二 原創(chuàng)) 上海的早晨又下雨了,王大姐6:50騎電瓶車從家里出發(fā)苍姜。雨下得大起來,王大姐的...
    蓮語_5955閱讀 391評論 1 2
  • (Drama Queen) 當(dāng)他問我可不可以寫一篇關(guān)于我的文章發(fā)在公眾號上時悬包,我是有點(diǎn)疑惑的:有什么好寫的衙猪?高...
    大肥龍喵閱讀 310評論 0 0
  • 企業(yè)家們是從事創(chuàng)新的活動,或者說布近,正在創(chuàng)新將企業(yè)家和普通的經(jīng)營者區(qū)分開來垫释。創(chuàng)新活動賦予了資源一種新的能力,在創(chuàng)造財(cái)...
    小播讀書閱讀 1,184評論 0 3