2016-11-11 5 views
3

を光栄にされていない私は、UI上でページネーションを実装したいので、私はこのようのfetchSizeを設定します。カサンドラ.setFetchSize()ステートメントには

boundStatement.setFetchSize(20) 

しかしsetFetchSizeメソッド()光栄されていません。私のテーブルは現在400行あり、400行すべてが取り出されます。

rs.getExecutionInfo().getPagingState(); 

を使用して次の行セットを取得すると、次の380行が取得されます。

.... 
.... 

// "SELECT * FROM abc.sometable" 
BoundStatement boundStatement = pStmt.bind(); 
boundStatement.setFetchSize(20); 

if (pagingState != null) { 
    boundStatement.setPagingState(PagingState.fromString(pagingState)); 
} 
ResultSet rs = session.execute(boundStatement); 
PagingState nextPage = rs.getExecutionInfo().getPagingState(); 
int remaining = rs.getAvailableWithoutFetching(); 
List<?> list = new ArrayList<>(); 
for (Row row : rs) { 
    list.add(getValidObjectFromRow(row)); 
} 
.... 

カサンドラ:だからページング状態を正しく設定し、検索が、なぜテーブルからすべての400行をretreivingドライバーですし、私はこれを回避したりすることができますどのようにそれは、コードのわずか400

部分を取得しますバージョン3.7およびcassandraドライババージョン3.1.0

ありがとう!

+0

ResultSetをどのように消費していますか?ドライバは、カバーの下に次の20行(など)をページングしている可能性があります。 –

+0

wiresharkを使用すると、クエリ/結果を見て、実際に20チャンクでフェッチしているかどうかを確認できます。より多くの制御が必要な場合は、クエリに 'LIMIT 20 'を追加し、手動でページしたいかもしれません。 –

+0

コードブロックで質問を更新しました。 – user1860447

答えて

4

setFetchSizeはページサイズを制御しますが、返される最大行数はResultSetにはなりません。サンプル・コードから上記のコードで

for (Row row : rs) { 
    list.add(getValidObjectFromRow(row)); 
} 

、それは最初の20行を反復し、それが現在の結果の最後に到達したときにもう行がクエリと一致しなくなるまで、それはより多くを取得します。

返される行数を制限する場合は、いくつかのオプションがあります。

  1. LIMIT X(xは必要な行数)をクエリの最後まで追加します。
  2. ローがなくなるまでのみすなわち、反復:
while(rs.getAvailableWithoutFetching() > 0) { 
    list.add(getValidObjectFromRow(rs.one())); 
} 

それが反復を停止します、その時点でのページにはより多くの行が、存在しなくなるまでこれがResultSetから読み込みます。

+1

ありがとうございます。私は戻って、javaドライバのドキュメントをもう一度読んで、あなたの応答は彼らに新しい意味を与えました!笑 :) – user1860447

関連する問題