1

重複の可能性:
HQLで制限クエリを実行するにはどうすればよいですか

大きいがサイズが不明なテーブルAがあります。テーブルから結果をバッチで、つまり一度に100個取得して、それらに対して操作を実行する必要があります。このために、変数mを使用して、mを1、101、201などとして繰り返すループ内でクエリ「SELECT * from ALIMITm、100」に相当するHQLを実行できるようにします。ループの終了条件は何ですか?上記のクエリをm>テーブルの行数の条件で実行するとどうなりますか?

4

3 に答える 3

1

あなたが抱えている問題は、ページネーションとして知られています。

そして、あなたの問題は、テーブルから取得できるページ数ですか?

ページネーションを使用するには、ページ数を知っている必要があります。

ページ数を設定するには、FROM 句は同じでSELECT count(*) FROM .... これにより、常に正しい答えが得られます。


余分なステートメントを使用できない、または使用したくない場合。次に、結果が空でなくなるまで、ページのデータベースとして使用する必要があります。したがって、結果のサイズがページサイズより小さくなるまで、ページ 1、ページ 2、... ページ n のステートメントを実行します。

int pageSize = 100;
int page     = 1;  
do {     
  currentPage = loadPage(page, pageSize);
  page++;
} while(currentPage.size() == pageSize); 
于 2012-09-28T16:40:52.730 に答える
1

select count(*) query first を使用すると、レコードの総数が得られます。それに応じて制限を設定する Java コードを記述します。(count/m) int = x= 完全なバッチの数と count-x*m = 最後のバッチの行。

于 2012-09-28T16:22:34.127 に答える
0

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」条件を追加しました。

お役に立てれば!!

于 2012-09-28T16:29:20.600 に答える