溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

spring?data?jpa怎么創(chuàng)建方法名進(jìn)行簡單查詢

發(fā)布時(shí)間:2022-02-23 13:47:16 來源:億速云 閱讀:149 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“spring data jpa怎么創(chuàng)建方法名進(jìn)行簡單查詢”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“spring data jpa怎么創(chuàng)建方法名進(jìn)行簡單查詢”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識吧。

spring data jpa 可以通過在接口中按照規(guī)定語法創(chuàng)建一個(gè)方法進(jìn)行查詢,spring data jpa 基礎(chǔ)接口中,如CrudRepository中findOne,save,delete等,那么我們自己怎么按照需要創(chuàng)建一個(gè)方法進(jìn)行查詢呢?

最常見的做法是

聲明一個(gè)接口繼承于CrudRepository 或者 PagingAndSortingRepository,JpaRepository,Repository

public interface TaskDao extends JpaRepository<Task,Long>{
}

或者利用注釋的方式表名繼承于JpaRepository,例如下面這倆種是等價(jià)的

@RepositoryDefinition(domainClass = Task.class, idClass = Long.class) 
public interface TaskDao{
}
public interface TaskDao extends JpaRepository<Task,Long>{
}

繼承CrudRepository 或者 PagingAndSortingRepository,JpaRepository會抽出一些常用的方法,如果你spring data jpa幫你自定義那么多方法,你可以繼承于JpaRepository,然后復(fù)制一些方法到你的接口中,可以選擇性的要一些方法

@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> {
}

按照規(guī)范創(chuàng)建查詢方法

一般按照java駝峰式書寫規(guī)范加一些特定關(guān)鍵字,例如我們想通過任務(wù)名來獲取任務(wù)實(shí)體類列表

利用屬性獲取任務(wù)列表

interface TaskDao extends MyBaseRepository<Task, Long> {
  List<Task> findByName(String name);
}

利用and 和 or來獲取任務(wù)列表

interface TaskDao extends JpaRepository<Task, Long> {
  List<Task> findByNameAndProjectId(String name,Long projectId);
  List<Task> findByNameOrProjectId(String name,Long projectId);
}

利用Pageable ,Sort,Slice獲取分頁的任務(wù)列表和排序

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進(jìn)行排序

interface TaskDao extends JpaRepository<Task, Long> {
    List<Person> findByNameOrderByProjectIdDesc(String name, Long projectId);
}

利用 Top 和 First來獲取限制數(shù)據(jù)

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是怎么通過這些規(guī)范來進(jìn)行組裝成查詢語句呢?

Spring Data JPA框架在進(jìn)行方法名解析時(shí),會先把方法名多余的前綴截取掉,比如 find、findBy、read、readBy、get、getBy,然后對剩下部分進(jìn)行解析。

假如創(chuàng)建如下的查詢:findByTaskProjectName(),框架在解析該方法時(shí),首先剔除 findBy,然后對剩下的屬性進(jìn)行解析,假設(shè)查詢實(shí)體為Doc

  • 先判斷 taskProjectName (根據(jù) POJO 規(guī)范,首字母變?yōu)樾懀┦欠駷椴樵儗?shí)體的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,繼續(xù)第二步;

  • 從右往左截取第一個(gè)大寫字母開頭的字符串此處為Name),然后檢查剩下的字符串是否為查詢實(shí)體的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒有該屬性,則重復(fù)第二步,繼續(xù)從右往左截??;最后假設(shè)task為查詢實(shí)體Person的一個(gè)屬性;

  • 接著處理剩下部分(ProjectName),先判斷 task 所對應(yīng)的類型是否有projectName屬性,如果有,則表示該方法最終是根據(jù) “ Person.task.projectName”的取值進(jìn)行查詢;否則繼續(xù)按照步驟 2 的規(guī)則從右往左截取,最終表示根據(jù) “Person.task.project.name” 的值進(jìn)行查詢。

  • 可能會存在一種特殊情況,比如 Person包含一個(gè) task 的屬性,也有一個(gè) projectName 屬性,此時(shí)會存在混淆??梢悦鞔_在屬性之間加上 “_” 以顯式表達(dá)意圖,比如 “findByTask_ProjectName()”

支持的規(guī)范表達(dá)式

這里以實(shí)體為User,有firstName和lastName,age

表達(dá)式例子hql查詢語句
AndfindByLastnameAndFirstname&hellip; where x.lastname = ?1 and x.firstname = ?2
OrfindByLastnameOrFirstname&hellip; where x.lastname = ?1 or x.firstname = ?2
Is,EqualsfindByFirstname,findByFirstnameIs,findByFirstnameEqual&hellip; where x.firstname = 1?
BetweenfindByStartDateBetween&hellip; where x.startDate between 1? and ?2
LessThanfindByAgeLessThan&hellip; where x.age < ?1
LessThanEqualfindByAgeLessThanEqual&hellip; where x.age &lArr; ?1
GreaterThanfindByAgeGreaterThan&hellip; where x.age > ?1
GreaterThanEqualfindByAgeGreaterThanEqual&hellip; where x.age >= ?1
AfterfindByStartDateAfter&hellip; where x.startDate > ?1
BeforefindByStartDateBefore&hellip; where x.startDate < ?1
IsNullfindByAgeIsNull&hellip; where x.age is null
IsNotNull,NotNullfindByAge(Is)NotNull&hellip; where x.age not null
LikefindByFirstnameLike&hellip; where x.firstname like ?1
NotLikefindByFirstnameNotLike&hellip; where x.firstname not like ?1
StartingWithfindByFirstnameStartingWith&hellip; where x.firstname like ?1 (parameter bound with appended %)
EndingWithfindByFirstnameEndingWith&hellip; where x.firstname like ?1 (parameter bound with prepended %)
ContainingfindByFirstnameContaining&hellip; where x.firstname like ?1 (parameter bound wrapped in %)
OrderByfindByAgeOrderByLastnameDesc&hellip; where x.age = ?1 order by x.lastname desc
NotfindByLastnameNot&hellip; where x.lastname <> ?1
InfindByAgeIn(Collection ages)&hellip; where x.age in ?1
NotInfindByAgeNotIn(Collection age)&hellip; where x.age not in ?1
TruefindByActiveTrue()&hellip; where x.active = true
FalsefindByActiveFalse()&hellip; where x.active = false
IgnoreCasefindByFirstnameIgnoreCase&hellip; where UPPER(x.firstame) = UPPER(?1)

讀到這里,這篇“spring data jpa怎么創(chuàng)建方法名進(jìn)行簡單查詢”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點(diǎn)還需要大家自己動手實(shí)踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI