您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“spring data jpa怎么創建方法名進行簡單查詢”,內容詳細,步驟清晰,細節處理妥當,希望這篇“spring data jpa怎么創建方法名進行簡單查詢”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
spring data jpa 可以通過在接口中按照規定語法創建一個方法進行查詢,spring data jpa 基礎接口中,如CrudRepository中findOne,save,delete等,那么我們自己怎么按照需要創建一個方法進行查詢呢?
聲明一個接口繼承于CrudRepository 或者 PagingAndSortingRepository,JpaRepository,Repository
public interface TaskDao extends JpaRepository<Task,Long>{ }
或者利用注釋的方式表名繼承于JpaRepository,例如下面這倆種是等價的
@RepositoryDefinition(domainClass = Task.class, idClass = Long.class) public interface TaskDao{ } public interface TaskDao extends JpaRepository<Task,Long>{ }
繼承CrudRepository 或者 PagingAndSortingRepository,JpaRepository會抽出一些常用的方法,如果你spring data jpa幫你自定義那么多方法,你可以繼承于JpaRepository,然后復制一些方法到你的接口中,可以選擇性的要一些方法
@NoRepositoryBean interface MyBaseRepository<T, ID extends Serializable> extends Repository<T, ID> { T findOne(ID id); T save(T entity); } interface TaskDao extends MyBaseRepository<Task, Long> { }
一般按照java駝峰式書寫規范加一些特定關鍵字,例如我們想通過任務名來獲取任務實體類列表
利用屬性獲取任務列表
interface TaskDao extends MyBaseRepository<Task, Long> { List<Task> findByName(String name); }
利用and 和 or來獲取任務列表
interface TaskDao extends JpaRepository<Task, Long> { List<Task> findByNameAndProjectId(String name,Long projectId); List<Task> findByNameOrProjectId(String name,Long projectId); }
利用Pageable ,Sort,Slice獲取分頁的任務列表和排序
interface TaskDao extends JpaRepository<Task, Long> { Page<Task> findByName(String name,Pageable pageable); Slice<Task> findByName(String name, Pageable pageable); List<Task> findByName(String name, Sort sort); }
利用Distinct去重
interface TaskDao extends JpaRepository<Task, Long> { List<Person> findDistinctTaskByNameOrProjectId(String name, Long projectId); }
利用OrderBy進行排序
interface TaskDao extends JpaRepository<Task, Long> { List<Person> findByNameOrderByProjectIdDesc(String name, Long projectId); }
利用 Top 和 First來獲取限制數據
interface TaskDao extends JpaRepository<Task, Long> { User findFirstByOrderByLastnameAsc(); Task findTopByOrderByNameDesc(String name); Page<Task> queryFirst10ByName(String name, Pageable pageable); Slice<Task> findTop3ByName(String name, Pageable pageable); List<Task> findFirst10ByName(String name, Sort sort); List<Task> findTop10ByName(String name, Pageable pageable); }
那么spring data jpa是怎么通過這些規范來進行組裝成查詢語句呢?
Spring Data JPA框架在進行方法名解析時,會先把方法名多余的前綴截取掉,比如 find、findBy、read、readBy、get、getBy,然后對剩下部分進行解析。
假如創建如下的查詢:findByTaskProjectName(),框架在解析該方法時,首先剔除 findBy,然后對剩下的屬性進行解析,假設查詢實體為Doc
先判斷 taskProjectName (根據 POJO 規范,首字母變為小寫)是否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,繼續第二步;
從右往左截取第一個大寫字母開頭的字符串此處為Name),然后檢查剩下的字符串是否為查詢實體的一個屬性,如果是,則表示根據該屬性進行查詢;如果沒有該屬性,則重復第二步,繼續從右往左截取;最后假設task為查詢實體Person的一個屬性;
接著處理剩下部分(ProjectName),先判斷 task 所對應的類型是否有projectName屬性,如果有,則表示該方法最終是根據 “ Person.task.projectName”的取值進行查詢;否則繼續按照步驟 2 的規則從右往左截取,最終表示根據 “Person.task.project.name” 的值進行查詢。
可能會存在一種特殊情況,比如 Person包含一個 task 的屬性,也有一個 projectName 屬性,此時會存在混淆。可以明確在屬性之間加上 “_” 以顯式表達意圖,比如 “findByTask_ProjectName()”
這里以實體為User,有firstName和lastName,age
表達式 | 例子 | hql查詢語句 |
---|---|---|
And | findByLastnameAndFirstname | … where x.lastname = ?1 and x.firstname = ?2 |
Or | findByLastnameOrFirstname | … where x.lastname = ?1 or x.firstname = ?2 |
Is,Equals | findByFirstname,findByFirstnameIs,findByFirstnameEqual | … where x.firstname = 1? |
Between | findByStartDateBetween | … where x.startDate between 1? and ?2 |
LessThan | findByAgeLessThan | … where x.age < ?1 |
LessThanEqual | findByAgeLessThanEqual | … where x.age ⇐ ?1 |
GreaterThan | findByAgeGreaterThan | … where x.age > ?1 |
GreaterThanEqual | findByAgeGreaterThanEqual | … where x.age >= ?1 |
After | findByStartDateAfter | … where x.startDate > ?1 |
Before | findByStartDateBefore | … where x.startDate < ?1 |
IsNull | findByAgeIsNull | … where x.age is null |
IsNotNull,NotNull | findByAge(Is)NotNull | … where x.age not null |
Like | findByFirstnameLike | … where x.firstname like ?1 |
NotLike | findByFirstnameNotLike | … where x.firstname not like ?1 |
StartingWith | findByFirstnameStartingWith | … where x.firstname like ?1 (parameter bound with appended %) |
EndingWith | findByFirstnameEndingWith | … where x.firstname like ?1 (parameter bound with prepended %) |
Containing | findByFirstnameContaining | … where x.firstname like ?1 (parameter bound wrapped in %) |
OrderBy | findByAgeOrderByLastnameDesc | … where x.age = ?1 order by x.lastname desc |
Not | findByLastnameNot | … where x.lastname <> ?1 |
In | findByAgeIn(Collection ages) | … where x.age in ?1 |
NotIn | findByAgeNotIn(Collection age) | … where x.age not in ?1 |
True | findByActiveTrue() | … where x.active = true |
False | findByActiveFalse() | … where x.active = false |
IgnoreCase | findByFirstnameIgnoreCase | … where UPPER(x.firstame) = UPPER(?1) |
讀到這里,這篇“spring data jpa怎么創建方法名進行簡單查詢”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。