0

1 対多の関係を持つオブジェクトのリストに対して、一貫性があり効率的なページネーションを実装する必要があります。リスト内のアイテムはグループで表示され、グループ メンバーの数はグループによって異なります。一部のグループにはメンバーが含まれていない場合があります。ページングは​​、グループ メンバーの数によって決定する必要があります。

たとえば、家族の写真のディレクトリについて考えてみましょう。ルールは次のとおりです。

  1. 各ファミリー ユニットは、ページ上でセットとしてグループ化されます。
  2. 同じページに任意の数のファミリを表示できます。
  3. 1 ページあたり約 10 枚の写真が必要です。
  4. 家族全員が同じページに表示される必要があります。ページの最後のファミリが 10 枚の制限を超える場合は、そのファミリをこのページに残すか、次のページに表示するかのいずれかを行い、これを一貫して行います。
  5. 家族の写真がない場合、家族グループは写真なしで表示されます。写真がないため、このグループは 10 枚の写真の制限にはカウントされません。
  6. 10 枚以上の写真を持つ家族がいる可能性があり、この場合は処理する必要があります。

このアルゴリズムを開発するためのヒントを共有してください。プラットフォーム固有のヒントもいただければ幸いです。アプリケーションは、Hibernate 3.3.2 および Spring 2.5.6 を使用します。データベースは Oracle 10g です。

4

1 に答える 1

1

Hibernate では、クエリによって返される行数を制限できます。つまり、ページ サイズを設定できます。

Query.setMaxResults(nbr);

最初のページとは別のページをロードする場合は、ページの最初の行を次のように設定します

query.setFirstResult(rowNr);

どちらもメイン テーブル (家族) にのみ影響しますが、子テーブル (写真) の行数を制限しません。次に、非常に特別な要求があります (最初の家族が 3 枚の写真を持っている場合、2 番目の家族は通常の 10 枚ではなく、そのページで 7 枚の写真しか許可されません)。このため、ファミリー内の Hibernate の 1 対多の関係を忘れて、手動で行うことをお勧めします。これにより、写真の読み込みを完全に制御し、その数を制限できます.

  • family には、写真の hibernate プロパティを含めません。
  • 代わりに、メソッド 'getPhotos(int nbr_of_photos)' をクラス ファミリーに記述し、このファミリーの写真を photo テーブルから手動でロードします (Session と Query を使用)。必要に応じてその数を制限できます。必要に応じて、ファミリ オブジェクトに結果をキャッシュすることができます(オプション、必須ではありません)。
  • 写真では、ファミリの ID を単純な数値または文字列プロパティとして定義するか、多対単数のプロパティをファミリに定義できます。
于 2012-09-06T08:01:28.123 に答える