亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

spring data jpa 創(chuàng)建方法名進行簡單查詢方式

 更新時間:2022年02月23日 11:35:32   作者:node2017  
這篇文章主要介紹了spring data jpa 創(chuàng)建方法名進行簡單查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

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

最常見的做法是

聲明一個接口繼承于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,然后復(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ù)實體類列表

利用屬性獲取任務(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進行排序

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ī)范來進行組裝成查詢語句呢?

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

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

  • 先判斷 taskProjectName (根據(jù) POJO 規(guī)范,首字母變?yōu)樾懀┦欠駷椴樵儗嶓w的一個屬性,如果是,則表示根據(jù)該屬性進行查詢;如果沒有該屬性,繼續(xù)第二步;
  • 從右往左截取第一個大寫字母開頭的字符串此處為Name),然后檢查剩下的字符串是否為查詢實體的一個屬性,如果是,則表示根據(jù)該屬性進行查詢;如果沒有該屬性,則重復(fù)第二步,繼續(xù)從右往左截取;最后假設(shè)task為查詢實體Person的一個屬性;
  • 接著處理剩下部分(ProjectName),先判斷 task 所對應(yīng)的類型是否有projectName屬性,如果有,則表示該方法最終是根據(jù) “ Person.task.projectName”的取值進行查詢;否則繼續(xù)按照步驟 2 的規(guī)則從右往左截取,最終表示根據(jù) “Person.task.project.name” 的值進行查詢。
  • 可能會存在一種特殊情況,比如 Person包含一個 task 的屬性,也有一個 projectName 屬性,此時會存在混淆??梢悦鞔_在屬性之間加上 “_” 以顯式表達意圖,比如 “findByTask_ProjectName()”

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

這里以實體為User,有firstName和lastName,age

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

發(fā)現(xiàn)這些查詢都是只針對單表進行查詢,如果是多表的復(fù)雜查詢,還有分頁該怎么查,下次再研究看看…

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • Java程序員新手老手常用的八大開發(fā)工具

    Java程序員新手老手常用的八大開發(fā)工具

    這篇文章主要介紹了Java程序員新手老手常用的八大開發(fā)工具,需要的朋友可以參考下
    2017-05-05
  • Java 常見的并發(fā)問題處理方法總結(jié)

    Java 常見的并發(fā)問題處理方法總結(jié)

    這篇文章主要介紹了Java 常見的并發(fā)問題處理方法總結(jié),幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-02-02
  • java 設(shè)計模型之單例模式詳解

    java 設(shè)計模型之單例模式詳解

    本文主要介紹了java 單例模式,單例對象(Singleton)是一種常用的設(shè)計模式。在Java應(yīng)用中,單例對象能保證在一個JVM中,該對象只有一個實例存在,希望能幫助有需要的同學(xué)
    2016-07-07
  • Spring Boot 2.X 快速集成單元測試解析

    Spring Boot 2.X 快速集成單元測試解析

    這篇文章主要介紹了Spring Boot 2.X 快速集成單元測試解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • idea中自動生成Java類圖和時序圖的圖文教程

    idea中自動生成Java類圖和時序圖的圖文教程

    本文主要介紹了idea中自動生成Java類圖和時序圖的圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • java多態(tài)中的就近原則介紹

    java多態(tài)中的就近原則介紹

    大家好,本篇文章主要講的是java多態(tài)中的就近原則介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java批量從svn導(dǎo)出多個項目代碼實例

    Java批量從svn導(dǎo)出多個項目代碼實例

    這篇文章主要介紹了java批量從svn導(dǎo)出多個項目代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • java中接口和事件監(jiān)聽器的深入理解

    java中接口和事件監(jiān)聽器的深入理解

    這篇文章主要給大家介紹了關(guān)于java中接口和事件監(jiān)聽器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • java8之LocalDate的使用、LocalDate格式化問題

    java8之LocalDate的使用、LocalDate格式化問題

    這篇文章主要介紹了java8之LocalDate的使用、LocalDate格式化問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 使用Java找出兩個List中的重復(fù)元素三種方法

    使用Java找出兩個List中的重復(fù)元素三種方法

    在Java編程中,我們經(jīng)常需要找出兩個列表(List)中的重復(fù)元素,在本文中,我們將探討三種方法來實現(xiàn)這一目標,需要的朋友可以參考下
    2023-10-10

最新評論