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 ...