JPA怎麼使用,用一次查一次?總結程式碼中JPA各種場景使用規則

JPA的誕生是為了整合第三方ORM框架,簡歷一個標準的方式,也就是給大家提供了一個可適配的介面。供ORM框架使用。 我們這裡不談spring-data-jpa實現的原理。只整理一下,我們日常使用jpa的一些常規預發。

Jpa中方法定義規則

1、And 並且

示例:

findBylastNameAndFirstName

並且      where x。lastName=?1 and x。firstName = ?2

2、Or 或

示例:

findBylastNameOrFirstName

同功能sql: where x。lastName=?1 or x。firstName = ?2

3、Is,Equals 等於

示例:

findByFirstName, findByFirstNameIs,findByFirstNameEquals

同功能sql: where x。firstName = ?1

4、Between 兩者之間

示例:

findByStartDatebetween

同功能sql: where x。startDate betwwen ?1 and ?2

5、LessThan 小於

示例:

findByAgeLessThan

同功能sql:where x。age < ?1

6、LessThanEqual 小於等於

示例:

findByAgeLessThanEqual

同功能sql:where x。age <= ?1

7、GreaterThan 大於

示例:

findByAgeGreaterThan

同功能sql:where x。age > ?1

8、GreaterThanEqual 大於等於

示例:

findByAgeGreaterThanEqual

同功能sql:where x。age >= ?1

9、After 之後(時間) >

示例:

findByStartDateAfter

同功能sql:where x。startDate > ?1

10、Before 之前(時間) <

示例:

findByStartDateBefore

同功能sql:where x。startDate <?1

11、IsNull 等於

示例:

NullfindByAgeIsNull

同功能sql:where x。age is null

12、IsNotNull,NotNull 不等於

示例:

NullfindByAgeIsNotNull, findByAgeNotNull

同功能sql:where x。age fnot null

13、Like 模糊查詢。查詢件中需要自己加 %

示例:

findByLoginNameLike

同功能sql:where x。loginName like ?1

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

示例:

findByLoginNameNotLike

同功能sql:where x。loginName not like ?1

15、StartingWith 以某開頭

示例:

findByLoginNameStartingWith

同功能sql:where x。loginName like ?1(引數後加%)

16、EndingWith 以某結束

示例:

findByLoginNameEndingWith

同功能sql:where x。loginName like ?1(引數前加%)

17、Containing 包含某

示例:

findByLoginNameContaining

同功能sql:where x。loginName like ?1(引數前後加%)

18、OrderBy 排序

示例:

findByAgeOrderBylastNameDesc

同功能sql:where x。age = ?1 order by x。lastName desc

19、Not 不等於

示例:

findByLastNameNot

同功能sql:where lastName <> ?1

20、In 某範圍內

示例:

findByAgeIn

(Collection ages)

同功能sql:where x。age in ?1

21、NotIn 某範圍外

示例:

findByAgeNotIn

(Collection ages)

同功能sql:where x。age not in ?1

22、True 真

示例:

findByActiveTrue

()

同功能sql:where x。active = true

23、False 假

示例:

findByActiveFalse

()

同功能sql:where x。active = false

24、IgnoreCase 忽略大小寫

示例:

findByfirstNameIgnoreCase

同功能sql:where upper(x。firstName) =upper(?1)

重點

比如 findBy

UserAddressZip

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

先判斷

userAddressZip

(根據 POJO 規範,首字母變為小寫,下同)是否為 AccountInfo 的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,繼續第二步;

從右往左

擷取第一個大寫字母開頭的字串(此處為

Zip

),然後檢查剩下的字串是否為 AccountInfo 的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,則重複第二步,繼續從右往左擷取;最後假設

user

為 AccountInfo 的一個屬性;

接著處理剩下部分(

AddressZip

),先判斷 user 所對應的型別是否有 addressZip 屬性,如果有,則表示該方法最終是根據 “AccountInfo。user。addressZip” 的取值進行查詢;否則繼續按照步驟 2 的規則從右往左擷取,最終表示根據 “AccountInfo。user。address。zip” 的值進行查詢。

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

3、結果限制

/**     * 根據父ID,得到排序號最大的bo。     * 用於預計算新資源的排序號。     */Resource findFirstByFather_idOrderByOrderNumDesc(Long fatherId);​User findFirstByOrderByLastnameAsc();​User findTopByOrderByAgeDesc();​Page queryFirst10ByLastname(String lastname, Pageable pageable);​Slice findTop3ByLastname(String lastname, Pageable pageable);​List findFirst10ByLastname(String lastname, Sort sort);​List findTop10ByLastname(String lastname, Pageable pageable);

4、計數

Long countByLastname(String lastname);

大家好,我是小勁,專注分享java知識點,如有總結不到位的,歡迎小夥伴指點。感謝大家閱讀,歡迎點贊、轉發...