0

次のグループ化を含む条件ベースのクエリがあります。

Projections.projectionList()
    .add(Property.forName("xyz").group()));

生成された SQL は次のとおりです (独自仕様のため、クレンジングされています)。

select this_.XYZ as y0_ from FOO.BAR this_ WHERE [long where clause] 
    group by this_.XYZ

ここで、概念的には、クエリ結果を count(*) でラップして、データベースからデータが返されないようにします。カウントだけです。このような:

select count(*) from (
  select this_.XYZ as y0_ from FOO.BAR this_ WHERE [long where clause] 
      group by this_.XYZ
)

不要な行が何千行もある可能性があり、高性能に関心があるため、そのデータがネットワーク経由で送信されることは望ましくありません。

私の基準ベースの検索には、多数の条件があります。現実的に再構築することはできないので、基準に固執する必要があります。

もちろん、rowCount または count("xyz") を追加しても役に立ちません。行ごとに 1 が報告されるだけだからです。

私は現在、カウントを取得するためにこれを行っています:

ScrollableResults scroll = criteria.scroll();
scroll.last();
int count = scroll.getRowNumber();

機能しますが、カウントに戻るのに時間がかかります(問題がある場合はOracleで)。

私が提案していることを実行できますか?

4

2 に答える 2

7

概念的には、

select count(*) from (
  select this_.XYZ as y0_ from FOO.BAR this_ WHERE [long where clause] 
      group by this_.XYZ
)

と同じです

select count(distinct (this_.XYZ)) from FOO.BAR this_ WHERE [long where clause] 

したがって、Projections.countDistinct((String propertyName))Criteria に個別の propertyName を選択するために使用できます。

session.createCriteria(Foo.class)
        .add(myOrigianlCriterionObject)
        .setProjection(Projections.countDistinct("XYZ"));
于 2011-09-14T06:33:26.957 に答える
0

を使用しSubqueries APIて内部基準を作成します。

最初の基準は、グループがそれに含まれる主な基準です。行数は、100% 保証された結果の 2 番目の基準から取得されます。

最初の基準

DetachedCriteria criteria = getNominationMainCriteria(nominationFilterDto, appraiserId);
        criteria.add(Property.forName(PROFFESIONAL_STRING + ".hcpId").eqProperty("subProf.hcpId"));
        criteria.setProjection(Projections.projectionList().add(
                Projections.groupProperty(PROFFESIONAL_STRING + "." + Constants.HCP_ID)));

第二の基準

Criteria nativeCriteria = getSession().createCriteria(Professional.class, Constants.SUB_PROFESSIONAL);
        nativeCriteria.add(Subqueries.propertyEq(Constants.SUB_PROFESSIONAL + "." + Constants.HCP_ID, criteria));
        nativeCriteria.setProjection(Projections.projectionList().add(Projections.rowCount()));
        rowCount = (Long) nativeCriteria.uniqueResult();
于 2013-09-09T08:03:05.920 に答える