DynamoDB Query en Java (AWS SDK v2)

Query lit chaque élément qui partage une clé de partition, en restreignant éventuellement par la clé de tri. Dans l'AWS SDK for Java 2.x tu construis un QueryRequest avec un keyConditionExpression, et le queryPaginator intégré suit LastEvaluatedKey à travers chaque page de résultats pour toi.

Code

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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;

public class QueryExample {
    public static void main(String[] args) {
        try (DynamoDbClient ddb = DynamoDbClient.builder()
                .region(Region.US_EAST_1)
                .build()) {

            Map<String, String> names = new HashMap<>();
            names.put("#hashKey", "Artist");
            names.put("#rangeKey", "SongTitle");

            Map<String, AttributeValue> values = new HashMap<>();
            values.put(":hashKeyValue", AttributeValue.builder().s("Arturo Sandoval").build());
            values.put(":rangeKeyValue", AttributeValue.builder().s("C").build());

            QueryRequest request = QueryRequest.builder()
                    .tableName("Music")
                    .keyConditionExpression(
                            "#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)")
                    .expressionAttributeNames(names)
                    .expressionAttributeValues(values)
                    .build();

            List<Map<String, AttributeValue>> items = new ArrayList<>();
            for (QueryResponse page : ddb.queryPaginator(request)) {
                items.addAll(page.items());
            }
            System.out.println("Found " + items.size() + " items");
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Explication

  • keyConditionExpression — doit inclure une égalité sur la clé de partition (#hashKey = :hashKeyValue) plus au plus une condition de clé de tri (=, <, <=, >, >=, BETWEEN, ou begins_with). Les alias #hashKey/#rangeKey se résolvent en Artist/SongTitle via expressionAttributeNames (à l'abri des mots réservés).
  • expressionAttributeValues — la carte :placeholderAttributeValue typé.
  • Pagination — un Query renvoie au plus 1 Mo. ddb.queryPaginator(request) renvoie un QueryIterable qui émet paresseusement des requêtes de suivi à mesure que tu itères les pages ; chaque page QueryResponse porte une liste items(). (Tu le fais à la main ? Réinjecte lastEvaluatedKey() comme .exclusiveStartKey(...) jusqu'à ce qu'elle soit vide.)
  • Ajoute .scanIndexForward(false) pour inverser l'ordre de la clé de tri (l'ordre croissant est celui par défaut).
  • Interroge un index secondaire en ajoutant .indexName("...").
  • Tu préfères des objets Java simples ? Le DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) expose la même requête avec des classes bean annotées.

À faire visuellement

Le DynamoDB Expression Builder assemble la condition de clé et copie du code exécutable, pour que tu n'écrives pas à la main les cartes de placeholders et de valeurs.

Pour exécuter des requêtes sur de vraies tables dans une interface graphique — formulaire de condition de clé, grille paginée, copie en tant que code — télécharge DynoTable.

Exemples liés

References

Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.

Construis cette requête visuellement

Compose cette opération dans le Générateur de requêtes DynamoDB gratuit — condition de clé, filtre, index, Limit, ordre de tri et boucle de pagination — et copie-la en retour comme programme exécutable SDK v3, CLI ou boto3.

Ouvrir le Générateur de requêtes DynamoDB

Travaille avec DynamoDB sans la Console

DynoTable est un client de bureau rapide pour DynamoDB — parcours les tables, exécute des requêtes de style SQL et édite les items en local.