0

休止状態からの一連の結果にページネーションを実装しています。現在、私はやっています

long count = getCountResultForNamedQuery();
List result = getResultForNamedQuery()

2つのクエリは次のようなものです

select count(*) from addresses where country = 'USA';

select * from addresses where country = 'USA';

ページネーションのために、私は通常 getResultForQuery を更新して、.setFirstResult と setMaxResult が設定されるようにします。これにより、必要なセクションのみが返されます。ページのページネーション部分に表示するページ数を知るために、カウントを行う必要があります。

もっと効率よくできないかと考えていました。私はちょうどすることができます

List result = getResultForQuery();
int count = result.size();
List subResult = result.subList(start, end);

これは理にかなっていますか?可能であれば、1 つのクエリのみを呼び出そうとしています。問題は、休止状態がどれほど賢いかということです。size を呼び出すと、返されるオブジェクト シェルがカウントされますか、それともすべてを解決してからデータベースにヒットしますか? 使用するのに適したパターンはどれですか?

例が十分に明確でない場合はお詫び申し上げます。できるだけ単純化しようとしましたが、単純化しすぎた可能性があります。

前もって感謝します!

4

2 に答える 2

2

2 番目のソリューションは理にかなっていますが、米国からのすべてのアドレスをメモリにロードするため、パフォーマンスの災害につながる可能性がありますが、それらの数とこれらのアドレスの小さな範囲にのみ関心があります。クエリを実行すると、クエリはリストを返し、このリストにはクエリのすべての結果が入力されます。そのため、setFirstResult と setMaxResults が便利です。

絶対に正確なカウントを気にしない場合は、カウント クエリを 1 回だけ実行し、ページごとに「結果」クエリを実行できます。

于 2012-06-07T10:17:57.997 に答える
0

あなたは次のようにすることができます -

Query query = getSession().createQuery("your Query").setFirstResult(start_Index).setMaxResults(Number_Of_Records_You_Want_to_Display_on_page);

例えば ​​-

Query query = getSession().createQuery("select * from employee").setFirstResult(101).setMaxResults(100);
于 2012-06-07T10:08:01.643 に答える