2012-05-29 36 views
8

Tôi đang cố gắng truy vấn DynamoDB với trợ giúp của DynamoDBMapper bằng Java với cả hashKey và rangeKey. Nhưng tôi không nhận được tất cả các kết quả, nó chỉ trả về một phần của nó. Mã của tôi trông giống như:Làm cách nào tôi có thể truy xuất tất cả các mục từ kết quả được phân trang của truy vấn DynamoDBMapper()?

queryDynamoDb() { 
    Condition rangeKeyCondition = new Condition() 
    .withComparisonOperator(ComparisonOperator.GT.toString()) 
    .withAttributeValueList(new AttributeValue().withS("0")); 

    DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression(
      new AttributeValue().withS(prefKey)); 

    queryExpression.setRangeKeyCondition(rangeKeyCondition); 

    List<MyObj> myobjs = mapper.query(MyObj.class, queryExpression); 
    return myobjs; 
} 

MyObj được chú thích đúng với chú thích DynamoDB. Vì vậy, tôi có thể lưu các đối tượng, nhưng truy xuất trả về một phần kết quả duy nhất.

Các tài liệu của truy vấn trong DynamoDBMapper nói:

Phương pháp truy vấn trả về "lười biếng-nạp" bộ sưu tập. Tức là, ban đầu nó chỉ trả lại một trang kết quả. Nó làm cho một cuộc gọi dịch vụ cho trang tiếp theo khi cần thiết.

Bây giờ câu hỏi là, cách yêu cầu người lập bản đồ thực hiện cuộc gọi dịch vụ hoặc trang cần thiết, vì vậy nó tải tất cả các trang (có hiệu quả tất cả các mục)?

Trả lời

9

Đoạn mã Java trong tài liệu hướng dẫn Amazon DynamoDB cho DynamoDBMapper Class là một chút đáng tiếc ở đây (mặc dù công nghệ chính xác), các tài liệu AWS SDK for Java API cho Class DynamoDBMapper là (tự nhiên) chính xác hơn trong vấn đề này, xem phương pháp query():

public <T> PaginatedQueryList<T> query(Class<T> clazz, 
             DynamoDBQueryExpression queryExpression) 

Vì vậy, các loại trở lại thực sự là một Class PaginatedQueryList: thực hiện

của giao diện Danh sách đại diện cho kết quả fro m truy vấn trong AWS DynamoDB. Kết quả được phân trang được tải theo yêu cầu khi người dùng thực hiện một thao tác yêu cầu chúng. Một số hoạt động, chẳng hạn như size(), phải tìm nạp toàn bộ danh sách, nhưng kết quả là lazily được tìm nạp theo trang khi có thể. [nhấn mạnh của tôi]

Đó là, bạn thực sự không cần phải tải một cách rõ ràng bất cứ điều gì trong quá trình sử dụng bình thường, trong chừng mực nó mặc nhiên được đưa về chăm sóc bởi việc thực hiện lười biếng-tải của PaginatedQueryList<T>; tuy nhiên, nếu muốn vì bất kỳ lý do gì, bạn có thể kích hoạt nó bằng các thao tác yêu cầu quyền truy cập vào toàn bộ bộ sưu tập, với phương pháp được đề cập rõ ràng là size() là một trong số đó.

+0

Mở, tôi đồng ý với câu trả lời của bạn, Có vẻ như tôi đang gặp vấn đề tương tự. Câu hỏi ở đây, https://stackoverflow.com/questions/45495145/issue-with-caching-and-dynamo-db-combination – Deepak

Các vấn đề liên quan