DynamoDB DeleteItem in Java (AWS SDK v2)

Un'eliminazione in AWS SDK for Java 2.x è un DeleteItemRequest che porta con sé la chiave primaria completa, e ReturnValue.ALL_OLD ti dice se c'era davvero qualcosa.

Aggiungi una conditionExpression al codice qui sotto e sviluppa un bug che compila comunque. Il primo punto elenco sotto lo snippet è quel bug.

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

Spiegazione

  • ConditionalCheckFailedException estende DynamoDbException — quindi il blocco catch qui sopra inghiotte una guardia fallita e la stampa come se il servizio si fosse rotto. Non appena la richiesta porta una conditionExpression, intercetta prima il tipo più specifico. Una condizione che ha fatto il suo lavoro è un esito, non un errore.
  • L'eccezione porta con sé l'Item perdente — metti returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) sulla richiesta e e.item() ti restituisce la riga così come l'ha vista DynamoDB. AWS dichiara il prezzo: "No read capacity units are consumed."
  • attributes() non restituisce mai null — un'eliminazione che non ha trovato nulla produce una mappa vuota, quindi il test è isEmpty(). È hasAttributes() a separare «il servizio non ha restituito nulla» da «il servizio ha restituito una mappa vuota».
  • L'enum ReturnValue è condiviso con UpdateItemreturnValues(ReturnValue.ALL_NEW) qui compila e torna indietro come ValidationException, perché "DeleteItem does not recognize any values other than NONE or ALL_OLD". L'overload String del builder nasconde lo stesso errore (l'insieme completo).
  • Svuotare una tabella non è una chiamata APIDeleteItem elimina esattamente una chiave, e nulla nell'SDK ne elimina molte. Troncare una tabella è uno Scan per le chiavi seguito da scritture in batch, e di solito perde contro DeleteTable più CreateTable.

Fallo visivamente

Se l'attributo su cui metti la guardia è una parola riservata, la condizione ha bisogno di un alias #. Il verificatore delle parole riservate ti dice quali dei tuoi nomi di attributo stanno sulla lista di 573 parole di AWS e genera la mappa expressionAttributeNames per quelli che ci sono.

DynoTable mette un'eliminazione in staging in un pannello Modifiche in sospeso prima che raggiunga la tabella. Cmd+Backspace mette in staging le righe selezionate, Cmd+Shift+Backspace elimina e fa commit in un colpo solo, e tutto ciò che è in staging può essere scartato. 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.