2017-08-31 87 views
5

所有我迄今知道的是,FindBy可以返回多個結果,而當我們使用它通過以下方式FindOneBy將返回一個結果或空。差異JPA

List<Department> findByDepartmentName(String name); 
Department findOneByDepartmentId(Long Id); 

現在,我的問題是,我可以使用findBy這種方式嗎?

Department findByDepartmentId(Long Id); 

如果是的話,

  • 讓我們假設有給定ID的多個記錄。
  • 憑什麼不findBydepartmentId返回一個記錄?

最後,何時或爲什麼我不應該使用findBy來代替findOneBy?

+0

我有同樣的問題,你有沒有得到這個底部? – Doug

回答

0

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

是的,從JPA的角度來看,這個語法在技術上是正確的。雖然Spring JPA推斷你想實現你的查詢看返回類型,以及什麼。

基本上這些都是個案的返回類型:

  • 與查詢要返回一個值 - 可以指定基本型,Entity TOptional<T>CompletableFuture<T>

  • 與您的查詢要返回T的集合 - 您可以指定List<T>Stream<T>,Page<T>,Slice<T>等。

話雖這麼說,你的查詢定義:

Department findByDepartmentId(Long Id); 

意味着你期望一個結果(因爲你已經指定了一個實體的返回類型)。這將反映在春天JPA如何執行查詢 - 它會調用getSingleResult()javax.persistence.Query接口,如果超過一個對象符合標準,這將拋出一個exception上。

findBydepartmentId在什麼基礎上返回單個記錄?

基於該對象具有該Id,否則會拋出異常。

當或爲什麼我不到位findOneBy的使用findBy?

這兩個有不同的含義,不可互換。

findOneBy總是導致調用getSingleResult()。

findBy根據返回類型具有不同的行爲 - 根據上面給出的定義。

0

findOneByXX將確保只有一條或沒有值,如果有2個值的異常將被拋出。但是findByXX不會使這種唯一性檢查