[英]Difference between findBy and findOneBy in Spring data JPA
到目前為止我所知道的是 FindBy 可以返回多個結果,而 FindOneBy 將返回單個結果或 null 當我們以下列方式使用它時。
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
現在,我的問題是,我可以這樣使用 findBy 嗎?
Department findByDepartmentId(Long Id);
如果是,
最后,何時或為什么不應該使用 findBy 代替 findOneBy?
我可以這樣使用
findBy
嗎? 部門findByDepartmentId(Long Id)
;
是的,從 Spring JPA 的角度來看,這種語法在技術上是正確的。 盡管 Spring JPA 也會通過查看返回類型的查詢來推斷您要實現的目標。
基本上這些是返回類型的情況:
對於您想要返回單個值的查詢 - 您可以指定basic type
、 Entity T
、 Optional<T>
、 CompletableFuture<T>
等。
對於您想要返回 T 集合的查詢 - 您可以指定List<T>
、 Stream<T>
、 Page<T>
、 Slice<T>
等。
話雖如此,您的查詢定義:
Department findByDepartmentId(Long Id);
意味着您期望一個結果(因為您已將Entity T
指定為返回類型)。 這將反映 Spring JPA 如何執行查詢 - 它將調用javax.persistence.Query
接口上的getSingleResult()
,如果多個對象滿足條件,它將拋出exception
。
findBydepartmentId
在什么基礎上返回單個記錄?
基於有一個具有該 Id 的對象,否則它將拋出異常。
何時或為什么不應該使用
findBy
代替findOneBy
?
兩者含義不同,不可互換。
findOneBy
總是導致調用getSingleResult()
。
findBy
根據返回類型具有不同的行為 - 根據上面給出的定義。
findOneByXX
將確保只有一個值或沒有值,如果有 2 個值將拋出異常。
但是findByXX
不會進行這種唯一性檢查。
我做了一些測試,Spring Data 忽略了方法( find
、 delete
、...)和By
之間的所有字符。
Spring Data 僅使用返回類型來決定如何處理響應。
因此,即使在語義上不正確,也可以定義以下這些方法。
Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.