私は、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
を使用できます。上記のクエリでどのように使用できますか?
このような結果の制限をサポートしていない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に頼る必要はありません。
コメントで述べたように、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)
;を使用します。も
ページネーションをハードコア化(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)
を渡す必要があり、リストから最初のレコードを取得します
こんにちは、単一行をフェッチし、jpqlでLIMITを使用すると、jpqlがネイティブクエリかどうかを確認できます。
(using-nativeQuery = true)
以下は使用法です
@Query("SELECT s FROM Students s ORDER BY s.id DESC LIMIT 1", nativeQuery=true)
Students getLastStudentDetails();
次のようなものを使用できます。
@Repository
public interface ICustomerMasterRepository extends CrudRepository<CustomerMaster, String>
{
@Query(value = "SELECT max(c.customer_id) FROM CustomerMaster c ")
public String getMaxId();
}