重複の可能性:
HQLで制限クエリを実行するにはどうすればよいですか
大きいがサイズが不明なテーブルAがあります。テーブルから結果をバッチで、つまり一度に100個取得して、それらに対して操作を実行する必要があります。このために、変数mを使用して、mを1、101、201などとして繰り返すループ内でクエリ「SELECT * from ALIMITm、100」に相当するHQLを実行できるようにします。ループの終了条件は何ですか?上記のクエリをm>テーブルの行数の条件で実行するとどうなりますか?
重複の可能性:
HQLで制限クエリを実行するにはどうすればよいですか
大きいがサイズが不明なテーブルAがあります。テーブルから結果をバッチで、つまり一度に100個取得して、それらに対して操作を実行する必要があります。このために、変数mを使用して、mを1、101、201などとして繰り返すループ内でクエリ「SELECT * from ALIMITm、100」に相当するHQLを実行できるようにします。ループの終了条件は何ですか?上記のクエリをm>テーブルの行数の条件で実行するとどうなりますか?
あなたが抱えている問題は、ページネーションとして知られています。
そして、あなたの問題は、テーブルから取得できるページ数ですか?
ページネーションを使用するには、ページ数を知っている必要があります。
ページ数を設定するには、FROM 句は同じでSELECT count(*) FROM ...
. これにより、常に正しい答えが得られます。
余分なステートメントを使用できない、または使用したくない場合。次に、結果が空でなくなるまで、ページのデータベースとして使用する必要があります。したがって、結果のサイズがページサイズより小さくなるまで、ページ 1、ページ 2、... ページ n のステートメントを実行します。
int pageSize = 100;
int page = 1;
do {
currentPage = loadPage(page, pageSize);
page++;
} while(currentPage.size() == pageSize);
select count(*) query first を使用すると、レコードの総数が得られます。それに応じて制限を設定する Java コードを記述します。(count/m) int = x= 完全なバッチの数と count-x*m = 最後のバッチの行。
hibernate 関数 setFirstResult() および setMaxResults() を使用して、目的の結果を達成することをお勧めします。たとえば、以下のようになります。
Query query= session.createQuery("SELECT * from A");
int resultSize = 100;
List<?> pagedResults = null;
//use any approriate number for iterations or do a result count first to get the expected result size
for(int m=0; ; m++){
pagedResults = (List<?>)query.setFirstResult(m*resultSize).setMaxResults((m+1)*resultSize).list();
//do your processing
if(pagedResults.isEmpty() || pagedResults.size() <resultSize){
break; //no further iterations required
}
}
setMaxResults() は、結果のサイズのみを制限します。使用可能なレコードが少ない場合、それらのレコードのみが結果に表示されます。不必要な反復を避けるために「if」条件を追加しました。
お役に立てれば!!