0

データツリーテーブルにデータセットを一覧表示する必要があるユーザー要件があります。

データセットには、1対多のフィールドが含まれます。

例:製品には、名前、タイプ、および多くの色があります。

したがって、それらの色は別のテーブルに保存されます(1対多の関係)

ユーザーは、データテーブルに製品をリストし、フィールドの1つとして色を含めることを望んでいます

例:RED、GREEN、BLUE、Yellow(色分け)

これは結合を伴うため非常にコストのかかる操作であるため、1000個の製品がある場合、ロードに長い時間がかかります。

OOTの質問。

基準はリスト機能を使用しています。そして、ResultTransformer(Criteria.ROOT_ENTITY)とsetMaxResult(5000)を設定しました。

私の理解では、これは5000レコードを取得し、結果を変換します

しかし、それは私が最後にリストされているレコードが5000未満になることを意味します。

どうすれば最小値を確保できますか。5000レコードの?

Criteria crit = getCriteria(Product.clas)
crit.setMaxResult(5000)
crit.ResultTransformer(Criteria.DISTINCT_ROOT_ENTITY )
4

1 に答える 1

1
  1. 結合(FetchType.eagerを含む)で重複した行を削除する場合は、次を使用する必要があります。

    Criteria.DISTINCT_ROOT_ENTITY 
    いいえ
    Criteria.ROOT_ENTITY
    Criteria.ROOT_ENTITYを使用すると、結果の各行はルートエンティティのインスタンスになります。

  2. ほとんどの場合、私は2つの別々のクエリを使用することを好みます。

最初のクエリには、Criteria.DISTINCT_ROOT_ENTITYの条件のみがあり、PK値を返します。

2番目のクエリは、最初のクエリの結果からPKによるページ付けまたは最大サイズ制限のある結果を選択します。

// First Query
Criteria ct1 = createCriteria(Product.class)
    .add( Restrictions.eq("blah", val) )
    .setProjection(Projections.id());
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
List<Integer> pks = ct1.list();

// Second Query
Criteria ct2 = createCriteria(Product.class)
    .add( Restrictions.in("id", pks) )
    .setFirstResult(000)
    .setMaxResult(000)
return ct2.list();

重要な問題は、最初のクエリで直接ページネーションを適用できないことです。ページネーションオプションのsetMaxResultまたはsetFirstResultは、Criteria.DISTINCT_ROOT_ENTITYの前に適用されるためです。したがって、2番目のクエリを実行する必要があります。

于 2012-07-19T04:33:52.167 に答える