web-dev-qa-db-ja.com

JPQLの代替のLIMIT句とは何ですか?

私は、JPQLで実装するPostgreSQLクエリを使用しています。

これはサンプルのネイティブpsqlクエリで、正常に動作しますが、

SELECT * FROM students ORDER BY id DESC LIMIT 1;

JPQLの同じクエリは機能しません。

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1")

Students getLastStudentDetails();

jPQLではLIMIT句が機能しないようです。

JPAのドキュメントによると、setMaxResults/setFirstResultを使用できます。上記のクエリでどのように使用できますか?

34
Madhu

このような結果の制限をサポートしていないJPQLを使用しています。ネイティブJPQLを使用する場合は、setMaxResultsを使用して結果を制限する必要があります。

ただし、Spring Data JPAを使用しているため、基本的に非常に簡単です。クエリに基づいて結果を制限する方法については、リファレンスガイドの here を参照してください。次の場合、findメソッドはまさにあなたが望むことをします。

findFirstByOrderById();

クエリでPageable句の代わりにLIMIT引数を使用することもできます。

@Query("SELECT s FROM Students s ORDER BY s.id DESC")
List<Students> getLastStudentDetails(Pageable pageable);

次に、呼び出しコードで次のようにします(リファレンスガイドの here で説明)。

getLastStudentDetails(new PageRequest(0,1));

どちらも同じ結果をもたらすはずであり、プレーンなSQLに頼る必要はありません。

44
M. Deinum

コメントで述べたように、JPQLはLIMITキーワードをサポートしていません。

setMaxResultsを使用してこれを実現できますが、必要なのが単一のアイテムである場合は、getSingleResultを使用します。アイテムが見つからない場合は例外をスローします。

したがって、クエリは次のようになります。

TypedQuery<Student> query = entityManager.createQuery("SELECT s FROM Students s ORDER BY s.id DESC", Student.class);    
query.setMaxResults(1);

特定の開始オフセットを設定する場合は、query.setFirstResult(initPosition);を使用します。も

10
dazito

ページネーションをハードコア化(new PageRequest(0, 1))して、1つのレコードのみを取得します。

    @QueryHints({ @QueryHint(name = "org.hibernate.cacheable", value = "true") })
    @Query("select * from a_table order by a_table_column desc")
    List<String> getStringValue(Pageable pageable);

レコードを取得するにはnew PageRequest(0, 1)を渡す必要があり、リストから最初のレコードを取得します

1
tk_

こんにちは、単一行をフェッチし、jpqlでLIMITを使用すると、jpqlがネイティブクエリかどうかを確認できます。

(using-nativeQuery = true)

以下は使用法です

@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1", nativeQuery=true)
Students getLastStudentDetails();
0
Manish Joshi

次のようなものを使用できます。

 @Repository
 public interface ICustomerMasterRepository extends CrudRepository<CustomerMaster, String> 
 {
    @Query(value = "SELECT max(c.customer_id) FROM CustomerMaster c ")
    public String getMaxId();
 }
0
Rajib Das Gupta