There are more AWS SDK examples available in the AWS Doc SDK Examples
The following code examples show how to query a table with pagination.
Implement pagination for DynamoDB query results.
Use the LastEvaluatedKey to retrieve subsequent pages.
Control the number of items per page with the Limit parameter.
- SDK for Java 2.x
-
Query a DynamoDB table with pagination using AWS SDK for Java 2.x.
import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.dynamodb.DynamoDbClient; import software.amazon.awssdk.services.dynamodb.model.AttributeValue; import software.amazon.awssdk.services.dynamodb.model.DynamoDbException; import software.amazon.awssdk.services.dynamodb.model.QueryRequest; import software.amazon.awssdk.services.dynamodb.model.QueryResponse; import software.amazon.awssdk.services.dynamodb.model.ResourceNotFoundException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public List<Map<String, AttributeValue>> queryWithPagination( final String tableName, final String partitionKeyName, final String partitionKeyValue, final int pageSize) { CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue); CodeSampleUtils.validatePositiveInteger("Page size", pageSize); // Create expression attribute names for the column names final Map<String, String> expressionAttributeNames = new HashMap<>(); expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_PK, partitionKeyName); // Create expression attribute values for the column values final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_PK, AttributeValue.builder().s(partitionKeyValue).build()); // Create the query request QueryRequest.Builder queryRequestBuilder = QueryRequest.builder() .tableName(tableName) .keyConditionExpression(KEY_CONDITION_EXPRESSION) .expressionAttributeNames(expressionAttributeNames) .expressionAttributeValues(expressionAttributeValues) .limit(pageSize); // List to store all items from all pages final List<Map<String, AttributeValue>> allItems = new ArrayList<>(); // Map to store the last evaluated key for pagination Map<String, AttributeValue> lastEvaluatedKey = null; int pageNumber = 1; try { do { // If we have a last evaluated key, use it for the next page if (lastEvaluatedKey != null) { queryRequestBuilder.exclusiveStartKey(lastEvaluatedKey); } // Execute the query final QueryResponse response = dynamoDbClient.query(queryRequestBuilder.build()); // Process the current page of results final List<Map<String, AttributeValue>> pageItems = response.items(); allItems.addAll(pageItems); // Get the last evaluated key for the next page lastEvaluatedKey = response.lastEvaluatedKey(); if (lastEvaluatedKey != null && lastEvaluatedKey.isEmpty()) { lastEvaluatedKey = null; } System.out.println("Page " + pageNumber + ": Retrieved " + pageItems.size() + " items (Running total: " + allItems.size() + ")"); pageNumber++; } while (lastEvaluatedKey != null); System.out.println("Query with pagination complete. Retrieved a total of " + allItems.size() + " items across " + (pageNumber - 1) + " pages"); return allItems; } catch (ResourceNotFoundException e) { System.err.format("Error: The Amazon DynamoDB table \"%s\" can't be found.\n", tableName); throw e; } catch (DynamoDbException e) { System.err.println("Error querying with pagination: " + e.getMessage()); throw e; } }
Demonstrates how to query a DynamoDB table with pagination.
public static void main(String[] args) { final String usage = """ Usage: <tableName> <partitionKeyName> <partitionKeyValue> [pageSize] [region] Where: tableName - The Amazon DynamoDB table to query. partitionKeyName - The name of the partition key attribute. partitionKeyValue - The value of the partition key to query. pageSize (optional) - The maximum number of items to return per page. (Default: 10) region (optional) - The AWS region where the table exists. (Default: us-east-1) """; if (args.length < 3) { System.out.println(usage); System.exit(1); } final String tableName = args[0]; final String partitionKeyName = args[1]; final String partitionKeyValue = args[2]; final int pageSize = args.length > 3 ? Integer.parseInt(args[3]) : 10; final Region region = args.length > 4 ? Region.of(args[4]) : Region.US_EAST_1; System.out.println("Querying items with pagination (page size: " + pageSize + ")"); try { // Using the builder pattern to create and execute the query final List<Map<String, AttributeValue>> allItems = new PaginationQueryBuilder() .withTableName(tableName) .withPartitionKeyName(partitionKeyName) .withPartitionKeyValue(partitionKeyValue) .withPageSize(pageSize) .withRegion(region) .executeWithPagination(); // Process the results System.out.println("\nSummary: Retrieved a total of " + allItems.size() + " items"); // Display the first few items as a sample final int sampleSize = Math.min(5, allItems.size()); if (sampleSize > 0) { System.out.println("\nSample of retrieved items (first " + sampleSize + "):"); for (int i = 0; i < sampleSize; i++) { System.out.println(allItems.get(i)); } if (allItems.size() > sampleSize) { System.out.println("... and " + (allItems.size() - sampleSize) + " more items"); } } } catch (IllegalArgumentException e) { System.err.println("Invalid input: " + e.getMessage()); System.exit(1); } catch (ResourceNotFoundException e) { System.err.println("Table not found: " + tableName); System.exit(1); } catch (DynamoDbException e) { System.err.println("DynamoDB error: " + e.getMessage()); System.exit(1); } catch (Exception e) { System.err.println("Unexpected error: " + e.getMessage()); System.exit(1); } }
-
For API details, see Query in AWS SDK for Java 2.x API Reference.
-