[英]Spring Data JPA difference between findBy / findAllBy
使用 Spring Data JPA 關鍵字時有什么區別:
List<SomeEntity> findBySomeCondition();
和
List<SomeEntity> findAllBySomeCondition();
不,它們之間沒有區別,它們將執行完全相同的查詢,當從方法名稱派生查詢時,Spring Data 會忽略All
部分。 唯一重要的一點是By
關鍵字,它后面的任何內容都被視為字段名稱(除了像OrderBy
這樣的其他關鍵字, findAllByOrderByIdAsc
會導致一些奇怪的方法名稱,例如findAllByOrderByIdAsc
)。
這意味着這樣的事情是完全有效的:
List<SomeEntity> findAnythingYouWantToPutHereBySomeCondition();
並且將執行與以下完全相同的 SQL 查詢:
List<SomeEntity> findBySomeCondition();
或者
List<SomeEntity> findAllBySomeCondition();
Spring Data 2.3.6 版本的文檔討論了這個特性:
find
(或其他引入關鍵字)和By
之間的任何文本都被認為是描述性的,除非使用結果限制關鍵字之一,例如Distinct
在要創建的查詢上設置不同的標志或使用Top
/First
來限制查詢結果。
特性的目的在一篇關於 Spring Data 即將發布的 2.0 版本的博客文章中進行了解釋:
春季數據的方法解析使用前綴關鍵字,比如
find
,exists
,count
,並delete
和終止By
關鍵字。 您在find
和By
之間放置的所有內容都會使您的方法名稱更具表現力,並且不會影響查詢派生。
為了說明差異,讓我們看一下這兩個函數:
1. Set<Policy> findAllByRoleIn(Iterable<Role> role);
2. Set<Policy> findByRoleIn(Iterable<Role> role);
第一個函數生成的查詢:
1. select policy.id, policy.role from policy where (policy.role in (? , ? , ? , ?))
第二個函數生成的查詢:
2. select policy.id, policy.role from policy where (policy.role in (? , ? , ? , ?))
結論:顯然,如果我們查看兩個函數生成的查詢。 我們可以清楚地看到,兩個函數定義沒有區別,它們執行完全相同的查詢。
一個區別是使用 findAllBy Hibernate 過濾器(來自 org.hibernate.annotations 的@Filters)被應用,因此使用了不同的 sql。
如果我們想按名稱或其他一些條件(如findByFirstName(String firstName);
查找,則使用 findBy 方法findByFirstName(String firstName);
findAll 方法通常通過提供規范來查找
List<T> findAll(Specification<T> spec);
請參閱下面的文檔以獲得更清晰的信息:
http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.