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);
単一の行と正しい結果が返されるようにするにはどうすればよいですか。助けていただければ幸いです。よろしくお願いします。
何も「保証」する必要はありません。
Returnとして指定された並べ替えのコレクションがなく(たとえば、Employee
ではなくList<Employee>
)、クエリが複数の結果を返す場合、javax.persistence.NonUniqueResultException: result returns more than one elements
が起動します。
クエリがより多くの行を返し、そのうちの1つだけが必要な場合は、実際に必要な行を区別する条件を追加するか、同じ場合は古き良きdistinct
を追加します。
単一の行と正しい結果が返されるようにするにはどうすればよいですか。
クエリを書くときのあなたの仕事です
すぐに使用できるソリューションがあります。リポジトリでは、メソッドにfindFirstBy...
またはfindTopBy...
という名前を付けることができます。
詳細については、 Springリファレンスドキュメント を参照してください。
JPAには、単一の行getSingleResult
をフェッチするメソッドがありますが、リストをフェッチして、getResultList
の最初の要素を抽出することをお勧めします。
参照: 例
結果セットから1行のみを選択する場合は、jpaクエリの作成中にquery.setMaxResults method:を使用してレコード数を制限できます。
例:criteria.setMaxResults(25); :100レコードのうち25レコードのみをフェッチします。
JpaRepository(spring-data-jpa)を使用してデータベースから1行だけが必要な場合、これは非常に便利です。
repository.findAll().stream().findFirst().orElseThrow(...)
これはストリームであるため、行(またはオブジェクト)は行ごとにフェッチされると思います。