2017-05-30 277 views
0

我在卡桑德拉有一張桌子,有100萬條記錄。我想一次讀取100條記錄,所以如果我讀取前100個記錄,則下一個讀取應該從項目101開始。我如何獲得這種分頁?我也用PagingState但它沒有工作。卡桑德拉分頁

我的代碼如下:

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 

import com.datastax.driver.core.PagingState; 
import com.datastax.driver.core.ResultSet; 
import com.datastax.driver.core.Row; 
import com.datastax.driver.core.Session; 
import com.datastax.driver.core.Statement; 

/** 
* 
* The solution of skipping rows is that use page state rather than iterator 
* rows one by one. 
* 
*/ 
public class CassandraPaging { 

    private Session session; 

    public CassandraPaging(Session session) { 
     this.session = session; 
    } 

    /** 
    * Retrieve rows for the specified page offset. 
    * 
    * @param statement 
    * @param start 
    *   starting row (>1), inclusive 
    * @param size 
    *   the maximum rows need to retrieve. 
    * @return List<Row> 
    */ 
    public List<Row> fetchRowsWithPage(Statement statement, int start, int size) { 
     ResultSet result = skipRows(statement, start, size); 
     return getRows(result, start, size); 
    } 

    private ResultSet skipRows(Statement statement, int start, int size) { 
     ResultSet result = null; 
     int skippingPages = getPageNumber(start, size); 
     String savingPageState = null; 
     statement.setFetchSize(size); 
     boolean isEnd = false; 
     for (int i = 0; i < skippingPages; i++) { 
      if (null != savingPageState) { 
       statement = statement.setPagingState(PagingState 
         .fromString(savingPageState)); 
      } 
      result = session.execute(statement); 
      PagingState pagingState = result.getExecutionInfo() 
        .getPagingState(); 
      if (null != pagingState) { 
       savingPageState = result.getExecutionInfo().getPagingState() 
         .toString(); 
      } 

      if (result.isFullyFetched() && null == pagingState) { 
       // if hit the end more than once, then nothing to return, 
       // otherwise, mark the isEnd to 'true' 
       if (true == isEnd) { 
        return null; 
       } else { 
        isEnd = true; 
       } 
      } 
     } 
     return result; 
    } 

    private int getPageNumber(int start, int size) { 
     if (start < 1) { 
      throw new IllegalArgumentException(
        "Starting row need to be larger than 1"); 
     } 
     int page = 1; 
     if (start > size) { 
      page = (start - 1)/size + 1; 
     } 
     return page; 
    } 

    private List<Row> getRows(ResultSet result, int start, int size) { 
     List<Row> rows = new ArrayList<>(size); 
     if (null == result) { 
      return rows; 
     } 
     int skippingRows = (start - 1) % size; 
     int index = 0; 
     for (Iterator<Row> iter = result.iterator(); iter.hasNext() 
       && rows.size() < size;) { 
      Row row = iter.next(); 
      if (index >= skippingRows) { 
       rows.add(row); 
      } 
      index++; 
     } 
     return rows; 
    } 
} 

這是主要的方法:

public static void main(String[] args) { 
    Cluster cluster = null; 
    Session session = null; 

    try { 
     cluster = Cluster.builder().addContactPoint("localhost").withPort(9042).build(); 
     session = cluster.connect("mykeyspace"); 

     Statement select = QueryBuilder.select().all().from("mykeyspace", "Mytable"); 

     CassandraPaging cassandraPaging = new CassandraPaging(session); 
     System.out.println("*************First Page1 **************"); 
     List<Row> firstPageRows = cassandraPaging.fetchRowsWithPage(select, 1, 5); 
     printUser(firstPageRows); 

     System.out.println("*************Second Page2 **************"); 
     List<Row> secondPageRows = cassandraPaging.fetchRowsWithPage(select, 6, 5); 
     printUser(secondPageRows); 

     System.out.println("*************Third Page3 **************"); 
     List<Row> thirdPageRows = cassandraPaging.fetchRowsWithPage(select, 6, 5); 
     printUser(thirdPageRows); 

     cluster.close(); 
     session.close(); 

    } catch(Exception exp) { 
     exp.printStackTrace(); 
    } finally { 
     cluster.close(); 
     session.close(); 
    } 
} 

private static void printUser(final List<Row> inRows) { 
    for (Row row : inRows) { 
     System.out.println("Id is:" + row.getUUID("id")); 
     System.out.println("Name is:" + row.getInt("name")); 
     System.out.println("account is:" + row.getString("account")); 
    } 
} 
+0

顯示您的代碼。你如何使用分頁狀態? –

回答

0

要採用如下方案,你需要在你的類路徑彈簧的數據依賴關係。

Spring提供PageRequest這是Pageable實現,即acceps pageNosize(沒有記錄顯示在頁面上)。

import org.springframework.data.domain.PageRequest; 
import org.springframework.data.domain.Pageable; 

PageRequest(int page, int size) 

創建回購。
爲了創建回購使用org.springframework.data.repository.PagingAndSortingRepository

class CasandraRepo extends PagingAndSortingRepository{ 

} 

//使用此pageReqrepository.findAll,如下所示;

Pageable pageReq = new PageRequest(0, 10); 
CasandraRepo repo; 
repo.findAll(pageReq); 
+0

其實我正在使用import com.datastax.driver.core.PagingState;當我獲取整個記錄時它工作正常,但我不想在一次完整的數據,所以我使用setFetchSize(),那麼它不起作用。 –