web-dev-qa-db-ja.com

Spring Data JPAのfindByとfindOneByの違い

私がこれまでに知っているのは、FindByが複数の結果を返すことができる一方で、FindOneByが次の方法で使用すると単一の結果またはnullを返すことです。

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

今、私の質問は、この方法でfindByを使用できますか?

Department  findByDepartmentId(Long Id);

そうであれば、

  • 特定のIDに複数のレコードがあると仮定しましょう。
  • findBydepartmentIdはどの基準に基づいて単一のレコードを返しますか?

最後に、findOneByの代わりにfindByを使用するべきではないタイミングまたは理由は何ですか?

15
Arun Gowda

このようにfindByを使用できますか?部門findByDepartmentId(Long Id);

はい、この構文はSpring JPAの観点から技術的に正しいです。 Spring JPAは、return typeも見てクエリで達成しようとしていることを推測しますが。

基本的に、これらは戻り型の場合です。

つまり、クエリ定義:

_Department findByDepartmentId(Long Id);
_

は、単一の結果を期待することを意味します(戻り値の型として_Entity T_を指定したため)。これは、Spring JPAがクエリを実行する方法を反映します。 getSingleResult() を呼び出します _javax.persistence.Query_ インターフェースは、exception複数のオブジェクトが基準を満たす場合。

findBydepartmentIdはどの基準で単一のレコードを返しますか?

そのIDを持つ単一のオブジェクトがあることに基づいて、それ以外の場合は例外をスローします。

findByの代わりにfindOneByを使用するべきではない場合と理由

これら2つの意味は異なり、互換性はありません。

findOneByは、常に getSingleResult() が呼び出されます。

findByは、上記の定義に従って、戻り値の型に応じて異なる動作をします。

13
hovanessyan

findOneByXXは、値が1つだけであるか、値がないことを保証します。2つの値がある場合、例外がスローされます。

ただし、findByXXはこの一意性のチェックを行いません。

4