GetItem DynamoDB en Java (AWS SDK v2)

L'AWS SDK for Java 2.x modélise un élément comme une Map<String, AttributeValue> assemblée via des builders immuables. Deux de ses conventions diffèrent de la plupart des autres SDK : les nombres sont typés comme des chaînes, et les collections de réponse ne sont jamais nulles.

La requête elle-même a besoin de la clé primaire complète, comme partout ailleurs.

Code

import java.util.HashMap;
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.GetItemRequest;

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

            Map<String, AttributeValue> key = new HashMap<>();
            key.put("Artist", AttributeValue.builder().s("Arturo Sandoval").build());
            key.put("SongTitle", AttributeValue.builder().s("Cubano Chant").build());

            Map<String, String> names = new HashMap<>();
            names.put("#proj0", "Artist");
            names.put("#proj1", "SongTitle");
            names.put("#proj2", "AlbumTitle");
            names.put("#proj3", "Year");

            GetItemRequest request = GetItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .projectionExpression("#proj0, #proj1, #proj2, #proj3")
                    .expressionAttributeNames(names)
                    .build();

            Map<String, AttributeValue> item = ddb.getItem(request).item();
            if (item.isEmpty()) {
                System.out.println("Item not found");
            } else {
                System.out.println(item);
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Explication

  • n() prend un StringAttributeValue.builder().n(1994) ne compile pas. La Javadoc en donne la raison : "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." C'est donc n("1994"), et le parsing au retour t'appartient.
  • item() ne renvoie jamais null — une absence de correspondance donne une map vide, donc le test c'est isEmpty(). Pour distinguer « le service n'a rien renvoyé » de « le service a renvoyé une map vide », appelle hasItem() ; le SDK construit automatiquement des collections vides et hasItem() est la seule chose qui voit au travers.
  • La map qu'il te rend est immuable — la Javadoc est explicite : la modifier lève une UnsupportedOperationException. Copie-la d'abord dans une HashMap si tu comptes l'éditer.
  • Rien ne valide la map d'alias localementexpressionAttributeNames est une simple Map<String, String>. #proj3 est obligatoire ici parce que Year est un mot réservé, et un alias que tu déclares sans jamais le référencer est une erreur à part entière, côté service : "Value provided in ExpressionAttributeNames unused in expressions".
  • Un seul client pour toute l'application — AWS le dit sans détour : "Service clients in the AWS SDK for Java 2.x are thread-safe." Le bloc try-with-resources convient à un main ponctuel ; dans un service au long cours, construis le client au démarrage et ne le ferme jamais à chaque requête.
  • .consistentRead(true) double le coût de lecture et est rejeté sur un GSI. Si les maps d'AttributeValue finissent par lasser, le DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) projette les éléments sur des beans annotés au-dessus de ces mêmes appels bas niveau.

Le faire visuellement

Savoir si cette lecture facture 0,5 ou 1 unité de capacité se joue sur le fait que l'élément tienne ou non sous 4 Ko. Le calculateur de taille d'élément mesure un élément collé par rapport à cette frontière.

DynoTable affiche les mêmes éléments comme des lignes ordinaires, et exporte la requête derrière la grille sous forme de programme Java bâti sur ces builders. Télécharge DynoTable.

Exemples liés

Références

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

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.