DynamoDB DeleteItem in Java (AWS SDK v2)

Ein Delete im AWS SDK for Java 2.x ist ein DeleteItemRequest mit dem vollständigen Primary Key, und ReturnValue.ALL_OLD sagt dir, ob überhaupt etwas da war.

Ergänze den Code unten um eine conditionExpression, und er entwickelt einen Bug, der trotzdem kompiliert. Der erste Stichpunkt unter dem Snippet ist dieser Bug.

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

Erklärung

  • ConditionalCheckFailedException erweitert DynamoDbException — der catch-Block oben schluckt also eine fehlgeschlagene Bedingung und gibt sie aus, als wäre der Dienst kaputt. Sobald die Anfrage eine conditionExpression trägt, fange zuerst den engeren Typ. Eine Bedingung, die ihre Arbeit getan hat, ist ein Ergebnis, kein Fehler.
  • Die Exception trägt das unterlegene Item — setz returnValuesOnConditionCheckFailure(ReturnValuesOnConditionCheckFailure.ALL_OLD) auf die Anfrage, und e.item() gibt dir die Zeile so zurück, wie DynamoDB sie gesehen hat. AWS nennt den Preis: "No read capacity units are consumed."
  • attributes() gibt nie null zurück — ein Delete, das nichts getroffen hat, liefert eine leere Map, isEmpty() ist also die richtige Prüfung. hasAttributes() ist das, was „der Dienst hat nichts zurückgegeben" von „der Dienst hat eine leere Map zurückgegeben" trennt.
  • Das ReturnValue-Enum ist mit UpdateItem geteiltreturnValues(ReturnValue.ALL_NEW) kompiliert hier und kommt als ValidationException zurück, denn "DeleteItem does not recognize any values other than NONE or ALL_OLD". Die String-Überladung des Builders verbirgt denselben Fehler (der vollständige Satz).
  • Eine Tabelle zu leeren ist kein API-AufrufDeleteItem löscht genau einen Key, und nichts im SDK löscht viele. Eine Tabelle zu truncaten ist ein Scan nach Keys gefolgt von gebündelten Writes und verliert meist gegen DeleteTable plus CreateTable.

Mach es visuell

Wenn das Attribut, auf das du die Bedingung setzt, ein reserviertes Wort ist, braucht die Bedingung einen #-Alias. Der Reserved-Words-Checker sagt dir, welche deiner Attributnamen auf AWS' 573-Wörter-Liste stehen, und erzeugt für diese die expressionAttributeNames-Map.

DynoTable stellt ein Delete in einem Panel für ausstehende Änderungen bereit, bevor es die Tabelle erreicht. Cmd+Backspace stellt die ausgewählten Zeilen bereit, Cmd+Shift+Backspace löscht und committet in einem Zug, und alles Bereitgestellte lässt sich verwerfen. DynoTable herunterladen.

Verwandte Beispiele

Referenzen

Zuletzt verifiziert am 2026-07-28 gegen die oben verlinkte offizielle AWS-Dokumentation.

Mit DynamoDB ohne die Console arbeiten

Ein schneller DynamoDB-Desktop-Client, der das echte SQL ausführt, das DynamoDB nicht kann — JOINs, GROUP BY, Aggregationen — mit visueller Bearbeitung und einem KI-Agenten auf deinen eigenen Bedrock-Schlüsseln.

30 Tage kostenlos testen, keine Kreditkarte — danach der Kostenlos-Tarif ohne Zeitlimit.