簡體   English   中英

Spring數據JPA中findBy和findOneBy的區別

[英]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);

如果是,

  • 讓我們假設給定的 Id 有多個記錄。
  • findBydepartmentId在什么基礎上返回單個記錄?

最后,何時或為什么不應該使用 findBy 代替 findOneBy?

我可以這樣使用findBy嗎? 部門findByDepartmentId(Long Id) ;

是的,從 Spring JPA 的角度來看,這種語法在技術上是正確的。 盡管 Spring JPA 也會通過查看返回類型的查詢來推斷您要實現的目標。

基本上這些是返回類型的情況:

話雖如此,您的查詢定義:

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 忽略了方法( finddelete 、...)和By之間的所有字符。

https://github.com/spring-projects/spring-data-commons/blob/14d5747f68737bb44441dc511cf16393d9d85dc8/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L65 中,它是\\p{Lu}.*? 部分。

Spring Data 僅使用返回類型來決定如何處理響應。

因此,即使在語義上不正確,也可以定義以下這些方法。

Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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