There are more AWS SDK examples available in the AWS Doc SDK Examples
The following code examples show how to query a table using a Global Secondary Index.
Query a DynamoDB table using its primary key.
Query a Global Secondary Index (GSI) for alternate access patterns.
Compare table queries and GSI queries.
- SDK for Java 2.x
-
Query a DynamoDB table using its primary key and a Global Secondary Index (GSI) with 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.HashMap; import java.util.Map; public QueryResponse queryTable( final String tableName, final String partitionKeyName, final String partitionKeyValue) { CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue); // 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 final QueryRequest queryRequest = QueryRequest.builder() .tableName(tableName) .keyConditionExpression(KEY_CONDITION_EXPRESSION) .expressionAttributeNames(expressionAttributeNames) .expressionAttributeValues(expressionAttributeValues) .build(); try { final QueryResponse response = dynamoDbClient.query(queryRequest); System.out.println("Query on base table successful. Found " + response.count() + " items"); return response; } catch (ResourceNotFoundException e) { System.err.format("Error: The Amazon DynamoDB table \"%s\" can't be found.\n", tableName); throw new DynamoDbQueryException("Table not found: " + tableName, e); } catch (DynamoDbException e) { System.err.println("Error querying base table: " + e.getMessage()); throw new DynamoDbQueryException("Failed to execute query on base table", e); } } /** * Queries a DynamoDB Global Secondary Index (GSI) by partition key. * * @param tableName The name of the DynamoDB table * @param indexName The name of the GSI * @param partitionKeyName The name of the GSI partition key attribute * @param partitionKeyValue The value of the GSI partition key to query * @return The query response from DynamoDB * @throws ResourceNotFoundException if the table or index doesn't exist * @throws DynamoDbException if the query fails */ public QueryResponse queryGlobalSecondaryIndex( final String tableName, final String indexName, final String partitionKeyName, final String partitionKeyValue) { CodeSampleUtils.validateTableParameters(tableName, partitionKeyName, partitionKeyValue); CodeSampleUtils.validateStringParameter("Index name", indexName); // Create expression attribute names for the column names final Map<String, String> expressionAttributeNames = new HashMap<>(); expressionAttributeNames.put(EXPRESSION_ATTRIBUTE_NAME_IK, partitionKeyName); // Create expression attribute values for the column values final Map<String, AttributeValue> expressionAttributeValues = new HashMap<>(); expressionAttributeValues.put( EXPRESSION_ATTRIBUTE_VALUE_IK, AttributeValue.builder().s(partitionKeyValue).build()); // Create the query request final QueryRequest queryRequest = QueryRequest.builder() .tableName(tableName) .indexName(indexName) .keyConditionExpression(GSI_KEY_CONDITION_EXPRESSION) .expressionAttributeNames(expressionAttributeNames) .expressionAttributeValues(expressionAttributeValues) .build(); try { final QueryResponse response = dynamoDbClient.query(queryRequest); System.out.println("Query on GSI successful. Found " + response.count() + " items"); return response; } catch (ResourceNotFoundException e) { System.err.format( "Error: The Amazon DynamoDB table \"%s\" or index \"%s\" can't be found.\n", tableName, indexName); throw new DynamoDbQueryException("Table or index not found: " + tableName + "/" + indexName, e); } catch (DynamoDbException e) { System.err.println("Error querying GSI: " + e.getMessage()); throw new DynamoDbQueryException("Failed to execute query on GSI", e); } }
Compare querying a table directly versus querying a GSI with AWS SDK for Java 2.x.
public static void main(String[] args) { final String usage = """ Usage: <tableName> <basePartitionKeyName> <basePartitionKeyValue> <gsiName> <gsiPartitionKeyName> <gsiPartitionKeyValue> [region] Where: tableName - The Amazon DynamoDB table to query. basePartitionKeyName - The name of the base table partition key attribute. basePartitionKeyValue - The value of the base table partition key to query. gsiName - The name of the Global Secondary Index. gsiPartitionKeyName - The name of the GSI partition key attribute. gsiPartitionKeyValue - The value of the GSI partition key to query. region (optional) - The AWS region where the table exists. (Default: us-east-1) """; if (args.length < 6) { System.out.println(usage); System.exit(1); } final String tableName = args[0]; final String basePartitionKeyName = args[1]; final String basePartitionKeyValue = args[2]; final String gsiName = args[3]; final String gsiPartitionKeyName = args[4]; final String gsiPartitionKeyValue = args[5]; final Region region = args.length > 6 ? Region.of(args[6]) : Region.US_EAST_1; try (DynamoDbClient ddb = DynamoDbClient.builder().region(region).build()) { final QueryTableAndGSI queryHelper = new QueryTableAndGSI(ddb); // Query the base table System.out.println("Querying base table where " + basePartitionKeyName + " = " + basePartitionKeyValue); final QueryResponse tableResponse = queryHelper.queryTable(tableName, basePartitionKeyName, basePartitionKeyValue); System.out.println("Found " + tableResponse.count() + " items in base table:"); tableResponse.items().forEach(item -> System.out.println(item)); // Query the GSI System.out.println( "\nQuerying GSI '" + gsiName + "' where " + gsiPartitionKeyName + " = " + gsiPartitionKeyValue); final QueryResponse gsiResponse = queryHelper.queryGlobalSecondaryIndex(tableName, gsiName, gsiPartitionKeyName, gsiPartitionKeyValue); System.out.println("Found " + gsiResponse.count() + " items in GSI:"); gsiResponse.items().forEach(item -> System.out.println(item)); // Explain the differences between querying a table and a GSI System.out.println("\nKey differences between querying a table and a GSI:"); System.out.println("1. When querying a GSI, you must specify the indexName parameter"); System.out.println("2. GSIs may not contain all attributes from the base table (projection)"); System.out.println("3. GSIs consume read capacity units from the GSI's capacity, not the base table's"); System.out.println("4. GSIs may have eventually consistent data (cannot use ConsistentRead=true)"); } catch (IllegalArgumentException e) { System.err.println("Invalid input: " + e.getMessage()); System.exit(1); } catch (ResourceNotFoundException e) { System.err.println("Table or index not found: " + e.getMessage()); 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.
-