web-dev-qa-db-ja.com

Spring Data JPAと@Queryアノテーションを使用して最初/最後の要素のみを取得する

EDIT:この問題に対する解決策は、この質問に関する2番目と4番目の回答で提供されています Spring-Data-JPAアノテーションのsetMaxResults?

目標:Spring Data JPAリポジトリとSpring Queryアノテーションを使用して、プロパティzで最大/最小要素を取得します。

私が今まで持っているもの

@Query("SELECT xelement FROM x xelement ORDER BY xelement.z")
public List<X> findFirstElement();

問題:このクエリは、すべての要素をフェッチします(実際には効果的ではありません)。 EntityManagerを直接使用する場合、次を使用して結果の数を設定できます。

entityManager.setMaxResults(1)

最初の要素のみを取得します。

質問:@ Query注釈を使用して結果の最大数を指定するにはどうすればよいですか?

アイデア:サイズ0のPageRequestを使用する方法ですか?

制約:「FindFirstBy ....」クエリ機能は知っていますが、@Query注釈。

17
Ueli Hofstetter

NativeQueryを@Queryアノテーションに追加するだけで、sqlのlimitプロパティを使用できます。ただし、これを行う別のより良い方法があります。リポジトリメソッドのページング可能なクラスは、@ Queryアノテーションに触れることなく問題を解決します。

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z")
List<X> findFirstElement(Pageable limit);

制限とオフセットを設定するには、次のようにこのリポジトリメソッドを呼び出す必要があります。

List<X> xValues = xRepository.findFirstElement(new PageRequest(0, 1));

ここで、1は必要な制限に対応します。

PDATE(SPRING DATA 2.0)

new PageRequest(0、1)の代わりにPageRequest.of(0、1)を使用します

10
ahmetcetin

ユースケースで考えられる最も近いJPAクエリ構文はfindFirstByZIsNotNullOrderByZAscです。これにより、カスタムネイティブクエリを記述する必要がなくなります。

1
comiventor

これを試してください:

@Query(value = "SELECT xelement FROM x xelement ORDER BY xelement.z  LIMIT 1",
       nativeQuery = true)
1
fjgarzon