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
同功能sql:where x。age in ?1
21、NotIn 某範圍外
示例:
findByAgeNotIn
(Collection
同功能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
4、計數
Long countByLastname(String lastname);
大家好,我是小勁,專注分享java知識點,如有總結不到位的,歡迎小夥伴指點。感謝大家閱讀,歡迎點贊、轉發...