簡體   English   中英

findBy / findAllBy 之間的 Spring Data JPA 區別

[英]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 版本的博客文章中進行了解釋:

春季數據的方法解析使用前綴關鍵字,比如findexistscount ,並delete和終止By關鍵字。 您在findBy之間放置的所有內容都會使您的方法名稱更具表現力,並且不會影響查詢派生。

為了說明差異,讓我們看一下這兩個函數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM