web-dev-qa-db-ja.com

JPA 2 CriteriaQuery、制限を使用

私は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();

誰も私を助けることができますか?

55
Menno

クエリlimit および offset を定義します:

return em.createQuery(query)
         .setFirstResult(offset) // offset
         .setMaxResults(limit) // limit
         .getResultList();

ドキュメントから:

TypedQuery setFirstResult(int startPosition)

取得する最初の結果の位置を設定します。パラメーター:startPosition-最初の結果の位置、0から番号付け

TypedQuery setMaxResults(int maxResult)

取得する結果の最大数を設定します。

133

完全を期すために、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を使用する方法です。

6
Kekzpanda