DynamoDB DeleteItem en Java (AWS SDK v2)

Un borrado en AWS SDK for Java 2.x es un DeleteItemRequest que lleva la clave principal completa, y ReturnValue.ALL_OLD te dice si realmente había algo.

Añade una conditionExpression al código de abajo y desarrolla un bug que sigue compilando. El primer punto bajo el fragmento es ese bug.

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.DeleteItemRequest;
import software.amazon.awssdk.services.dynamodb.model.DeleteItemResponse;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.ReturnValue;

public class DeleteItemExample {
    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());

            DeleteItemRequest request = DeleteItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .returnValues(ReturnValue.ALL_OLD)
                    .build();

            DeleteItemResponse response = ddb.deleteItem(request);
            if (response.attributes().isEmpty()) {
                System.out.println("No item with that key existed");
            } else {
                System.out.println("Deleted: " + response.attributes());
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

Explicación

  • ConditionalCheckFailedException extiende DynamoDbException — así que el catch de arriba se traga una guarda fallida y la imprime como si el servicio se hubiera roto. En cuanto la petición lleve una conditionExpression, captura primero el tipo más específico. Una condición que hizo su trabajo es un resultado, no un error.
  • La excepción lleva el elemento perdedor — pon returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) en la petición y e.item() te devuelve la fila tal como la vio DynamoDB. AWS indica el precio: "No read capacity units are consumed."
  • attributes() nunca devuelve null — un borrado que no encontró nada da un mapa vacío, así que isEmpty() es la prueba. hasAttributes() es lo que separa «el servicio no devolvió nada» de «el servicio devolvió un mapa vacío».
  • El enum ReturnValue se comparte con UpdateItemreturnValues(ReturnValue.ALL_NEW) compila aquí y vuelve como una ValidationException, porque "DeleteItem does not recognize any values other than NONE or ALL_OLD". La sobrecarga con String del builder esconde el mismo error (el conjunto completo).
  • Vaciar una tabla no es una llamada a la APIDeleteItem elimina exactamente una clave, y nada en el SDK elimina muchas. Truncar una tabla es un Scan de claves seguido de escrituras por lotes, y normalmente pierde frente a DeleteTable más CreateTable.

Hazlo visualmente

Si el atributo sobre el que aplicas la guarda es una palabra reservada, la condición necesita un alias #. El comprobador de palabras reservadas te dice cuáles de tus nombres de atributo están en la lista de 573 palabras de AWS y genera el mapa expressionAttributeNames para los que lo estén.

DynoTable prepara un borrado en un panel de cambios pendientes antes de que llegue a la tabla. Cmd+Backspace prepara las filas seleccionadas, Cmd+Shift+Backspace borra y confirma de una vez, y cualquier cosa preparada puede descartarse. 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.