Spring boot JPA的複雜查詢

2021-09-25 03:55:08 字數 1561 閱讀 9668

就很坑這個東西搞了乙個下午的時間,終於搞會怎麼用

對於想要查詢 a and (b or c )或者 a and b and (c or d)

在jpa裡你不能直接用and和or把字段拼起來,因為他並不會幫你自動加上括號,經過一下午的努力,學到了兩種方法,但是我只用了其中一種,另一種感覺emmm挺複雜的而且效率和復用性都很差,就沒去用。

1.這裡我把差不多的兩種都放在這裡,首先是自己用query注釋寫sql語句,這個復用性也很差好吧。然後差不多的就是,重新拼字段起來,把a and (b or c )變成a and b or a and c,就是把括號去掉就能直接使用,當然我遇到的情況是多條件判斷查詢的,這兩種明顯不符合我的要求,要寫太多冗雜**了,不符合自己完美主義hhhhhh

2.在jpa裡可以使用specification這個東西來對查詢加入條件,我稱他為條件構造器,具體使用:

pagefindall(specificationspecification, pageable pageable);

//實現自定義複雜條件和分頁

然後在使用的時候,新建乙個條件構造器,重寫他的topredicate方法,就能構造你想要的條件了。其中predicate我理解為條件,圍繞predicate進行構造

entityrepository.findall(new specification() 

//equal 為等於,predicate條件中還提供了sql語句中如like等關鍵字,通過使用不同關鍵字的方法實現不同的功能

switch (status)

predicate predicateand;//構造and條件

if (!list.isempty()) else

//當你使用where的時候就已經把條件放進你的查詢操作中了,因此不需要返回構造器給前面

return null;

}},new pagerequest(page - 1, size));

這樣就能輕鬆使用複雜查詢了!!!!

更新一下今天遇到用list入參的問題

在查詢後加in即可

listfindbyidin(listid);
更新!辣雞jpa越用感覺越麻煩,今天專案把springboot更到2.0以上版本了,jpa也一起更新了,2.0以上jpa把findone給刪掉了,findbyid返回值更改為optional包裝的物件,需要用get方法才能get到實際需要的物件如:

adminentity teacher = adminentityrepository.findbyid(body.getteacherid()).get();
而且在底層我們可以看到,當查詢物件為空,是直接丟擲錯誤的,並不會返回null,這裡需要我們注意

public t get() 

return value;

}

如果還想保持原來的邏輯功能,要不就trycatch搞起來,要不就自己寫乙個findbyidequal還有最快的是在findbyid後加上.orelse(null)(其實我想改原始碼但是適用性太低了)

Spring Boot JPA 命名規則

一 常用規則速查 1 and 並且 2 or 或 3 is,equals 等於 4 between 兩者之間 5 lessthan 小於 6 lessthanequal 小於等於 7 greaterthan 大於 8 greaterthanequal 大於等於 9 after 之後 時間 10 be...

SpringBoot JPA常用註解

就像 table註解用來標識實體類與資料表的對應關係類似,column註解來標識實體類中屬性與資料表中字段的對應關係。column name broker id columndefinition bigint 11 nullable false private long brokerid id co...

Spring Boot JPA訪問Mysql示例

上篇演示了通過m en構建spring boot 專案,引用web模組啟動應用,完成簡單的web 應用訪問,本章內容在此基礎上面加入資料訪問與埠修改,下文 與演例 本用例純手工測試通過,放心入坑 修改預設埠 在src main resources下加入application.properties內容...