web-dev-qa-db-ja.com

Hibernate HQL:実際に結果を返さずに結果のカウントを取得します

実際に結果のリストを取得せずに、動的に生成されたHQLクエリの結果のカウントを取得したいと思います。私が持っているクエリは次のようなものだとしましょう:

select Company company LEFT OUTER JOIN FETCH products product

私はHibernateのドキュメントで次のことを読みました。

クエリ結果を返さずに数えることができます。

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

....をクエリに置き換える必要があると思いましたが、HQLはFROMの副選択をサポートしていないため、機能しません。

では、動的に生成されたHQLクエリの結果をどのようにカウントする必要がありますか?それを実行して結果リストの.size()を取得することで、不要なオーバーヘッドが発生する可能性があると思います。

乾杯!

**更新:**

この正規表現を使用してクエリを変換しました。

Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult();

そして私はこれを得る:

ブロッククォート

EJB例外:;ネストされた例外は次のとおりです。Java.lang.IllegalArgumentException:org.hibernate.QueryException:クエリで指定された結合フェッチが、フェッチされた関連付けの所有者が選択リストに存在しませんでした[FromElement {explicit、not a collection join、fetch join、fetch non -遅延プロパティ、classAlias = product、role = org.myCompany.applicant.entity.Applicant.products、tableName = PRS_DEV.PRODUCT、tableAlias = products1_、Origin = PRS_DEV.APPLICANTappliant0_、colums = {applicant0_.APPLICANT_ID、className = org。 myCompany.product.entity.Product}}] [select count()from org.myCompany.applicant.entity.Applicant申請者LEFT OUTER JOIN FETCH申請者.products product];ネストされた例外は次のとおりです。Java.lang.IllegalArgumentException:org.hibernate.QueryException:クエリで指定された結合フェッチが、フェッチされた関連付けの所有者が選択リストに存在しませんでした[FromElement {explicit、not a collection join、fetch join、fetch non -遅延プロパティ、classAlias = product、role = org.myCompany.applicant.entity.Applicant.products、tableName = PRS_DEV.PRODUCT、tableAlias = products1_、Origin = PRS_DEV.APPLICANTappliant0_、colums = {applicant0_.APPLICANT_ID、className = org。 myCompany.product.entity.Product}}] [select count()from org.myCompany.applicant.entity.Applicant申請者LEFT OUTER JOIN FETCH申請者.products製品]

18

これでうまくいくはずです:

select count(*) FROM Company c JOIN ...

副選択は含まれていません。Companyを返す代わりに、カウントを返します。

編集:FETCHは現在適切ではありません。クエリからエンティティを返すのではなく、カウントのみを返すため、Hibernateは文句を言います。それを削除すると役立つはずです:

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product
13
Henning

次を使用して、クエリ結果のカウントを取得できます。

criteria.setProjection(Projections.rowCount());
count=(Long) criteria.uniqueResult();

お役に立てれば

12
Alok Bhandari