私はJPA 2を使用しています。安全上の理由から、CriteriaQueryでタイプセーフを使用しています(したがって、型付きクエリなどのソリューションを検索していません)。
最近、SQL-LIMITを設定する必要がある問題に遭遇しました。
多くの検索の後、私はまだ解決策を見つけることに成功していませんでした。
CriteriaQuery<Product> query = getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = query.from(Product.class);
query.select(product);
return em.createQuery(query).getResultList();
誰も私を助けることができますか?
クエリ で limit および offset を定義します:
return em.createQuery(query)
.setFirstResult(offset) // offset
.setMaxResults(limit) // limit
.getResultList();
ドキュメントから:
TypedQuery setFirstResult(int startPosition)
取得する最初の結果の位置を設定します。パラメーター:startPosition-最初の結果の位置、0から番号付け
TypedQuery setMaxResults(int maxResult)
取得する結果の最大数を設定します。
完全を期すために、JPA Criteria APIに関する最初の質問に答えたいと思います。
まず、、ユースケースに応じて、JPQLを使用するタイミングとCriteria APIを使用するタイミングを事前に明確にすることができます。これについての素敵な記事が ObjectDB documentation ウェブサイトにあります:
基準APIを使用する主な利点は、実行時ではなくコンパイル中にエラーを早期に検出できることです。一方、多くの開発者にとって、SQLクエリに非常によく似た文字列ベースのJPQLクエリは使いやすく、理解しやすいです。
JPA Criteria APIの使用方法を簡潔に説明しているため、この記事全体をお勧めします。 Query API について同様の記事があります。
質問に戻る:
CriteriaQuery
は、where()
メソッドを使用して、たとえばアクセス可能な一連の制限を提供します。直感的に推測できるように、クエリを特定の数の結果に制限することはできません-一意の識別子を制限するなどの些細なケースがある場合を除きます(Criteria APIの使用は廃止されます)。簡単に説明すると、制限は基準ではないため、そのAPIではカバーされません。詳細については、古くて金色の Java EE docs も参照してください。
ソリューション
ただし、もちろん、CriteriaQueryオブジェクトをJPQLクエリの基盤として使用できます。最初に、CriteriaQueryをそのまま作成します。
CriteriaQuery<Product> criteriaQuery =
getEntityManager().getCriteriaBuilder().createQuery(Product.class);
Root<Product> product = criteriaQuery.from(Product.class);
criteriaQuery.select(product);
次に、Query
オブジェクトにJPA CriteriaQuery
コンストラクターを使用します。
Query limitedCriteriaQuery = getEntityManager().createQuery(criteriaQuery)
.setMaxResults(resultLimit); // this is the important part
return limitedCriteriaQuery.getResultList();
そして、それは基本的に、ドキュメントと提供された記事に従って両方のAPIを使用する方法です。