SpringData JPA 介面和方法

2021-08-21 04:44:59 字數 4698 閱讀 3557

1.1 簡單查詢--介面方法

1.2 五個介面詳解

1.2.1    crudrepository介面

其中t是要操作的實體類,id是實體類主鍵的型別。該介面提供了11個常用操作方法。

@norepositorybean 

public

inte***cecrudrepositoryextendsserializable>extendsrepository

1.2.2    pagingandsortingrepository介面

該介面繼承了crudrepository介面,提供了兩個方法,實現了分頁和排序的功能了。

@norepositorybean 

public

inte***cepagingandsortingrepositoryextendsserializable>extendscrudrepository 

1.2.3       jparepository介面

該介面繼承了pagingandsortingrepository介面。

同時也繼承querybyexampleexecutor介面,這是個用「例項」進行查詢的介面,後續再寫文章詳細說明。

@norepositorybean

public

inte***cejparepositoryextendsserializable>

extendspagingandsortingrepository,querybyexampleexecutor

幾點說明:

(1)幾個查詢、及批量儲存方法,和 crudrepository 介面相比,返回的是 list,使用起來更方便。

(2)增加了inbatch 刪除,實際執行時,後台生成一條sql語句,效率更高些。相比較而言,crudrepository 介面的刪除方法,都是一條一條刪除的,即便是 deleteall 也是一條一條刪除的。

(3)增加了 getone()方法,切記,該方法返回的是物件引用,當查詢的物件不存在時,它的值不是null。

1.2.4       jpaspecificationexecutor介面

該介面提供了對jpa criteria查詢(動態查詢)的支援。這個介面很有用,具體不粘原始碼了。

1.3   方法定義規則

符號

含義

and並且or或

is,equals

等於between

兩者之間

lessthan

小於lessthanequal  

小於等於

greaterthan

大於greaterthanequal

大於等於

after

之後(時間)

>

before

之前(時間)

<

isnull

等於null

isnotnull,notnull

不等於null

like

模糊查詢。查詢件中需要自己加

%notlike    

不在模糊範圍內。查詢件中需要自己加

%startingwith

以某開頭

endingwith

以某結束

containing

包含某orderby

排序not

不等於in

某範圍內

notin

某範圍外

true

真false

假ignorecase

忽略大小寫

1.4  解析方法名--規則說明

1.4.1   規則描述

按照spring data定義的規則,查詢方法以find|read|get開頭(比如 find、findby、read、readby、get、getby),涉及條件查詢時,條件的屬性用條件關鍵字連線,要注意的是:條件屬性首字母需大寫。框架在進行方法名解析時,會先把方法名多餘的字首擷取掉,然後對剩下部分進行解析。

如果方法的最後乙個引數是 sort

或者pageable 型別,也會提取相關的資訊,以便按規則進行排序或者分頁查詢。

1.4.2   舉例說明

比如 findbyuseraddresszip()。框架在解析該方法時,首先剔除findby,然後對剩下的屬性進行解析,詳細規則如下(此處假設該方法針對的域物件為accountinfo型別):

1.      先判斷useraddresszip(根據 pojo 規範,首字母變為小寫,下同)是否為accountinfo 的乙個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,繼續第二步;

2.從右往左擷取第乙個大寫字母開頭的字串(此處為zip),然後檢查剩下的字串是否為accountinfo的乙個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,則重複第二步,繼續從右往左擷取;最後假設user為accountinfo 的乙個屬性;

3.      接著處理剩下部分(addresszip),先判斷 user 所對應的型別是否有addresszip 屬性,如果有,則表示該方法最終是根據 " accountinfo.user.addresszip" 的取值進行查詢;否則繼續按照步驟 2 的規則從右往左擷取,最終表示根據 " accountinfo.user.address.zip" 的值進行查詢。

可能會存在一種特殊情況,比如 accountinfo包含乙個 user 的屬性,也有乙個 useraddress 屬性,此時會存在混淆。讀者可以明確在屬性之間加上 "_" 以顯式表達意圖,比如 "findbyuser_addresszip()" 或者"findbyuseraddress_zip()"。(強烈建議:無論是否存在混淆,都要在不同類層級之間加上

"_"

,增加**可讀性)

1.4.3      一些情況

1.      當查詢條件為null時

舉例說明如下:

實體定義:對於乙個客戶實體cus,包含有name和***,均是string型別。

查詢方法定義:listfindbynameand***(string name,string ***);

使用時:dao.findbynameand***(null,"男");

後台生成sql片斷:where(cus0_.name is null) and cus0_.***=?

結論:當查詢時傳值是

null

時,資料庫中只有該字段是

null

的記錄才符合條件,並不是說忽略這個條件。也就是說,這種查詢方式,只適合於明確查詢條件必須傳的業務,對於動態查詢(條件多少是動態的,例如一般的查詢列表,由終端使用者使用時決定輸入那些查詢條件),這種簡單查詢是不能滿足要求的。

2.      排序

listfindby***orderbyname(string ***); //

名稱正序(正序時,推薦此方式,簡單)

listfindby***orderbynameasc(string ***); //

名稱正序(效果同上)

listfindby***orderbynamedesc(string ***); //

名稱倒序

3.      結果限制

/*** 根據父

id,得到排序號最大的bo。

* 用於預計算新資源的排序號。

*/resource findfirstbyfather_idorderbyordernumdesc(long fatherid);

user findfirstbyorderbylastnameasc();

user findtopbyorderbyagedesc();

pagequeryfirst10bylastname(string lastname,pageable pageable);

slicefindtop3bylastname(string lastname,pageable pageable);

listfindfirst10bylastname(string lastname,sort sort);

listfindtop10bylastname(string lastname,pageable pageable);

4.      計數

long countbylastname(string lastname);

5.      刪除

voiddeletebyproject_id(long id);

voiddeletebyproject_cus_id(long id);

SpringData JPA 介面和方法

1.1 簡單查詢 介面方法 1.2 五個介面詳解 1.2.1 crudrepository介面 其中t是要操作的實體類,id是實體類主鍵的型別。該介面提供了11個常用操作方法。norepositorybean publicinte ce crudrepository t,id extendsseri...

Spring Data JPA簡單查詢介面方法速查

下表針對於簡單查詢,即jparepository介面 繼承了crudrepository介面 pagingandsortingrepository介面 中的可訪問方法進行整理。1 先按照功能進行分類整理,分為儲存 刪除 查詢單個 查詢多個 其他5類。2 再將不建議使用的方法置灰,此類方法多為crud...

spring data jpa實體繼承

spring jpa中我們要將sql對映到物件,尤其是在spring boot這種高度自動化的環境下使用,大量的最優目錄結構與命名規則可以大大降低配置,約定大於配置貫穿其中。例如我們定義查詢dao,繼承jparepository即可。然後返回的物件,我們可以定義model entity table ...