8

誰かがすでに質問している場合はこの質問をし、おそらくばかげた質問をすることをお詫びしますが、私はこれに不慣れであり、あなたは専門家であり、あなたの専門家のアドバイスと経験から学びたいと思います。

1ページに200レコードを表示するアプリケーションにページングを追加したいと思います。ページの下部に数字が表示されているはずです。1050がある場合、最初のページには100が表示され、ページの下部には番号1、2、3、4、5、および6が表示されます。

これを達成するための一般的なロジックは何ですか?データベースは毎回200を選択する必要があり、最初のレコードを追跡する必要があることを知っています。

  1. ページの下部に表示する数を知ることができるように、合計で返されるレコードの数を知る方法はありますか?count()ステートメントまたは他の何かを選択する必要がありますか?
  2. 1050レコードの場合、番号1、2、3、4、5、および6が表示され、それぞれをクリックするにはサーバーへの呼び出しが必要です。サーバーへの次の呼び出しで返されるレコードの数を知る方法はありますか?count()ステートメントまたは他の何かを選択する必要がありますか?
4

4 に答える 4

8

これを実現するには、 JPACriteriaAPIを使用できます。TypedQueryを想定すると、データベースから返されるレコードを制限するためsetFirstResultにとを使用します。setLastResultもちろん、これらのメソッドの値は、要求されたページと、ページごとに表示されるレコードの数によって異なります。

first = (page - 1) * page size;
last = (page * size) - 1;

注:これは、最初のページが(ゼロではなく)1であることを前提としています。

レコード数を取得するには、標準のCriteriaクエリを実行します。例として:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class);
countQuery.select(builder.count(countQuery.from(MyEntity.class)));
final Long count = entityManager.createQuery(countQuery)
        .getSingleResult();

上記のコードをカスタマイズして、別のクエリに関連するカウントを実行することもできます。最後に、合計カウントをクライアントに返す何らかの方法が必要です。これを行う1つの方法は、クエリの結果セットを、カウントの属性を含む別のオブジェクトにラップするか、DAO呼び出しの結果としてそのオブジェクトを返すことです。または、リクエストスコープ内のオブジェクトにcount属性を格納することもできます。

public class ResultListWrapper<T> {
    private Long count;
    private Collection<T> results;

    // constructor, getters, setters
}
于 2012-04-13T16:39:01.607 に答える
2

実際のクエリを実行してページ数を見つける前に、列の代わりに選択リストでcount intを使用することを除いて、通常は同じクエリを実行します。Hibernateで特定のページを取得するには、次のようにします。

int maxRecords = // page size ...
int startRow = // page number * page size
Query query = session.createQuery('...');
query.setMaxResults(maxRecords);
query.setFirstResult(startRow);

追加のクエリの実行にコストがかかりすぎる場合は、次/前のリンクを提供するか、必要に応じて(たとえば、ロードされたデータの最後が表示されたときに)ajaxを介して追加のページを提供することを検討できます。

ページ番号リンクの表示を含むページ結果を表示するには、 display tag JSPタグライブラリを使用することをお勧めします(このデータを表示するためにjspページを使用していると仮定します) 。Displayタグは、JSPに取得できることを前提として、表形式データのページングと並べ替えの表示を処理します。

于 2012-04-13T16:35:20.717 に答える
0

はい、行自体を取得する前に、選択カウントを実行する必要があります。

于 2012-04-13T16:25:41.320 に答える
0

SpringDataJPAをご覧ください。基本的には、Perceptionが以前に提案した方法で機能します。それを行う必要がないというだけで、フレームワークがそれを行います。デフォルトでは、ページングと並べ替えが行われます( Query DSLを使用したくない場合は、自分でフィルタリングを行う必要があります)。

メインページに1時間のビデオがあり、簡単な紹介が表示されていますが、IDの機能を理解するには、約15分だけ見る必要があります。

于 2013-03-15T11:13:19.227 に答える