DynamoDB Query in Java (AWS SDK v2)
Query liest jedes Item, das denselben Partitionsschlüssel teilt, und grenzt optional über den Sortierschlüssel ein. Im AWS SDK for Java 2.x baust du einen QueryRequest mit einer keyConditionExpression, und der eingebaute queryPaginator folgt LastEvaluatedKey über jede Ergebnisseite für dich.
Code
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
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.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
public class QueryExample {
public static void main(String[] args) {
try (DynamoDbClient ddb = DynamoDbClient.builder()
.region(Region.US_EAST_1)
.build()) {
Map<String, String> names = new HashMap<>();
names.put("#hashKey", "Artist");
names.put("#rangeKey", "SongTitle");
Map<String, AttributeValue> values = new HashMap<>();
values.put(":hashKeyValue", AttributeValue.builder().s("Arturo Sandoval").build());
values.put(":rangeKeyValue", AttributeValue.builder().s("C").build());
QueryRequest request = QueryRequest.builder()
.tableName("Music")
.keyConditionExpression(
"#hashKey = :hashKeyValue AND begins_with(#rangeKey, :rangeKeyValue)")
.expressionAttributeNames(names)
.expressionAttributeValues(values)
.build();
List<Map<String, AttributeValue>> items = new ArrayList<>();
for (QueryResponse page : ddb.queryPaginator(request)) {
items.addAll(page.items());
}
System.out.println("Found " + items.size() + " items");
} catch (DynamoDbException e) {
System.err.println(e.getMessage());
}
}
}Erklärung
keyConditionExpression— muss eine Gleichheit auf dem Partitionsschlüssel enthalten (#hashKey = :hashKeyValue) plus höchstens eine Sortierschlüssel-Bedingung (=,<,<=,>,>=,BETWEENoderbegins_with). Die Aliase#hashKey/#rangeKeylösen perexpressionAttributeNameszuArtist/SongTitleauf (reservierte-Wort-sicher).expressionAttributeValues— die:placeholder→ typisierter-AttributeValue-Map.- Pagination — ein
Querygibt höchstens 1 MB zurück.ddb.queryPaginator(request)gibt einQueryIterablezurück, das beim Iterieren der Seiten träge Folgeanfragen absetzt; jedeQueryResponse-Seite trägt eineitems()-Liste. (Von Hand? GiblastEvaluatedKey()als.exclusiveStartKey(...)zurück, bis es leer ist.) - Füge
.scanIndexForward(false)hinzu, um die Sortierschlüssel-Reihenfolge umzukehren (aufsteigend ist der Standard). - Frage einen Sekundärindex ab, indem du
.indexName("...")hinzufügst. - Lieber schlichte Java-Objekte? Der DynamoDB Enhanced Client (
software.amazon.awssdk.enhanced.dynamodb) stellt dieselbe Abfrage mit annotierten Bean-Klassen bereit.
Visuell erledigen
Der DynamoDB Expression Builder stellt die Schlüsselbedingung zusammen und kopiert lauffähigen Code, sodass du keine Platzhalter- und Wert-Maps von Hand schreiben musst.
Um Abfragen gegen echte Tabellen in einer GUI auszuführen — Schlüsselbedingungs-Formular, paginiertes Raster, Copy-as-Code — lade DynoTable herunter.
Verwandte Beispiele
- DynamoDB Query in Go — dieselbe Abfrage mit AWS SDK for Go v2.
- DynamoDB Scan in Java — wenn du dich nicht in eine Partition einschlüsseln kannst.
- Query vs. Scan — warum
Queryder richtige Standard ist. - Key-Condition-Ausdrücke — jeder legale Partitions-/Sortierschlüssel-Operator.
- "Query condition missed key schema element" — die Schlüsselbedingung benennt das falsche Attribut oder überspringt den Partitionsschlüssel.
- "Query key condition not supported" — ein Operator, den die Schlüsselbedingung nicht nutzen kann, wie contains oder eine zweite Sortierschlüssel-Bedingung.
References
- Query — Amazon DynamoDB API Reference
- Use Query with an AWS SDK or CLI — Amazon DynamoDB Developer Guide
- DynamoDbClient — AWS SDK for Java 2.x API Reference
- QueryRequest — AWS SDK for Java 2.x API Reference
- Querying tables — Amazon DynamoDB Developer Guide
Zuletzt verifiziert am 2026-07-13 gegen die oben verlinkte offizielle AWS-Dokumentation.