GetItem DynamoDB in Java (AWS SDK v2)

AWS SDK for Java 2.x modella un Item come una Map<String, AttributeValue> assemblata tramite builder immutabili. Due delle sue convenzioni differiscono dalla maggior parte degli altri SDK: i numeri sono tipizzati come stringhe, e le collection di risposta non sono mai null.

La richiesta in sé ha bisogno della chiave primaria completa, come ovunque.

Codice

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());
        }
    }
}

Spiegazione

  • n() prende una StringAttributeValue.builder().n(1994) non compila. Il Javadoc ne dà la ragione: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Quindi è n("1994"), e il parsing al ritorno è affar tuo.
  • item() non restituisce mai null — un mancato riscontro produce una mappa vuota, quindi il test è isEmpty(). Per distinguere "il servizio non ha restituito nulla" da "il servizio ha restituito una mappa vuota", chiama hasItem(); l'SDK costruisce automaticamente collection vuote e hasItem() è l'unica cosa che vede oltre quel velo.
  • La mappa che restituisce è immutabile — il Javadoc è esplicito sul fatto che modificarla solleva UnsupportedOperationException. Copiala prima in una HashMap se hai intenzione di modificarla.
  • Nulla valida la mappa di alias in localeexpressionAttributeNames è una semplice Map<String, String>. Qui #proj3 è necessario perché Year è una parola riservata, e un alias che dichiari ma non referenzi mai è un errore a sé lato servizio: "Value provided in ExpressionAttributeNames unused in expressions".
  • Un solo client per l'intera applicazione — AWS lo dice chiaramente: "Service clients in the AWS SDK for Java 2.x are thread-safe." Il blocco try-with-resources va bene per un main usa e getta; in un servizio a lunga esecuzione, costruisci il client all'avvio e non chiuderlo mai per singola richiesta.
  • .consistentRead(true) raddoppia il costo di lettura ed è rifiutato su un GSI. Se le mappe di AttributeValue ti stanno strette, il DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) mappa gli Item su bean annotati sopra queste stesse chiamate di basso livello.

Fallo visivamente

Che questa lettura fatturi 0,5 o 1 unità di capacità dipende dal fatto che l'Item stia entro i 4 KB. Il calcolatore della dimensione degli Item misura un Item incollato rispetto a quel confine.

DynoTable mostra gli stessi Item come normali righe, ed esporta la query dietro la griglia come un programma Java costruito con questi builder. Scarica DynoTable.

Esempi correlati

Riferimenti

Ultima verifica 2026-07-28 rispetto alla documentazione ufficiale AWS collegata sopra.

Lavora con DynamoDB senza la Console

Un client desktop veloce per DynamoDB che esegue il vero SQL che DynamoDB non può — JOINs, GROUP BY, aggregazioni — con modifica visuale e un agente AI sulle tue chiavi Bedrock.

Prova gratuita di 30 giorni, senza carta di credito — poi il piano Free senza limiti di tempo.