GetItem de DynamoDB en Java (SDK de AWS v2)

El SDK de AWS para Java 2.x modela un Item como un Map<String, AttributeValue> ensamblado con builders inmutables. Dos de sus convenciones difieren de las de casi todos los demás SDK: los números se tipan como cadenas y las colecciones de la respuesta nunca son null.

La petición en sí necesita la clave principal completa, igual que en todas partes.

Código

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

Explicación

  • n() recibe un StringAttributeValue.builder().n(1994) no compila. El Javadoc da la razón: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." Así que es n("1994"), y el parseo a la vuelta es cosa tuya.
  • item() nunca devuelve null — un fallo da un mapa vacío, así que la prueba es isEmpty(). Para separar «el servicio no devolvió nada» de «el servicio devolvió un mapa vacío», llama a hasItem(); el SDK construye automáticamente colecciones vacías y hasItem() es lo único que ve a través de eso.
  • El mapa que te devuelve es inmutable — el Javadoc es explícito en que modificarlo lanza UnsupportedOperationException. Cópialo antes a un HashMap si piensas editarlo.
  • Nada valida el mapa de alias localmenteexpressionAttributeNames es un Map<String, String> corriente. #proj3 es obligatorio aquí porque Year es una palabra reservada, y un alias que declaras pero nunca referencias es un error propio del lado del servicio: «Value provided in ExpressionAttributeNames unused in expressions».
  • Un cliente para toda la aplicación — AWS lo dice llanamente: "Service clients in the AWS SDK for Java 2.x are thread-safe." El bloque try-with-resources encaja en un main de un solo uso; en un servicio de larga vida, construye el cliente al arrancar y no lo cierres nunca por petición.
  • .consistentRead(true) duplica el coste de lectura y se rechaza sobre un GSI. Si los mapas de AttributeValue se te quedan cortos, el DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) mapea Items sobre beans anotados encima de estas mismas llamadas de bajo nivel.

Hazlo visualmente

Que esta lectura facture 0,5 o 1 unidad de capacidad se reduce a si el Item cabe en 4 KB. La calculadora de tamaño de Item mide un Item pegado contra ese límite.

DynoTable muestra los mismos Items como filas corrientes, y exporta la consulta que hay detrás de la cuadrícula como un programa Java construido con estos builders. Descarga DynoTable.

Ejemplos relacionados

Referencias

Verificado por última vez el 2026-07-28 contra la documentación oficial de AWS enlazada arriba.

Trabaja con DynamoDB sin la Consola

Un cliente de escritorio rápido para DynamoDB que ejecuta el SQL real que DynamoDB no puede — JOINs, GROUP BY, agregaciones — con edición visual y un agente de IA con tus propias claves de Bedrock.

Prueba gratuita de 30 días, sin tarjeta — después, el plan Free sin límite de tiempo.