web-dev-qa-db-ja.com

JPAで単一行を取得する

JPAのエンティティから単一の行を取得するにはどうすればよいですか?

表:従業員

    @Id
    private int empId;
    private String empName;
    ...    

JPAはデフォルトでリストを返します。単一の行をフェッチしようとしています。

EmployeeRepository:-

    public Employee findByEmpName(String empName);

別の方法はそれを行うことです。@ Queryを使用する必要があります。

    @Query(value="select e from Employee e where empName = ?1 limit 1", nativeQuery=true)
    public Employee findByEmpName(String empName);

単一の行と正しい結果が返されるようにするにはどうすればよいですか。助けていただければ幸いです。よろしくお願いします。

3
Akkave

何も「保証」する必要はありません。

Returnとして指定された並べ替えのコレクションがなく(たとえば、EmployeeではなくList<Employee>)、クエリが複数の結果を返す場合、javax.persistence.NonUniqueResultException: result returns more than one elementsが起動します。

クエリがより多くの行を返し、そのうちの1つだけが必要な場合は、実際に必要な行を区別する条件を追加するか、同じ場合は古き良きdistinctを追加します。

単一の行と正しい結果が返されるようにするにはどうすればよいですか。

クエリを書くときのあなたの仕事です

4
Zeromus

すぐに使用できるソリューションがあります。リポジトリでは、メソッドにfindFirstBy...またはfindTopBy...という名前を付けることができます。

詳細については、 Springリファレンスドキュメント を参照してください。

6
milosdju

JPAには、単一の行getSingleResultをフェッチするメソッドがありますが、リストをフェッチして、getResultListの最初の要素を抽出することをお勧めします。

参照:

2
fireandfuel

結果セットから1行のみを選択する場合は、jpaクエリの作成中にquery.setMaxResults method:を使用してレコード数を制限できます。

例:criteria.setMaxResults(25); :100レコードのうち25レコードのみをフェッチします。

0

JpaRepository(spring-data-jpa)を使用してデータベースから1行だけが必要な場合、これは非常に便利です。

repository.findAll().stream().findFirst().orElseThrow(...)

これはストリームであるため、行(またはオブジェクト)は行ごとにフェッチされると思います。

0
Igor