Java (AWS SDK v2) での DynamoDB Query
Query は1つのパーティションキーを共有するすべてのアイテムを読み取り、任意でソートキーによって絞り込みます。AWS SDK for Java 2.x では、keyConditionExpression を持つ QueryRequest を構築し、組み込みの queryPaginator がすべての結果ページにわたって LastEvaluatedKey を代わりに追跡します。
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());
}
}
}Explanation
keyConditionExpression— パーティションキーに対する等価(#hashKey = :hashKeyValue)に加え、最大1つのソートキー条件(=、<、<=、>、>=、BETWEEN、またはbegins_with)を含める必要があります。#hashKey/#rangeKeyエイリアスはexpressionAttributeNamesを介してArtist/SongTitleに解決されます(予約語に安全)。expressionAttributeValues—:placeholder→ 型付きAttributeValueのマップ。- ページネーション — 1回の
Queryは最大 1 MB を返します。ddb.queryPaginator(request)はQueryIterableを返し、ページを反復するにつれて後続リクエストを遅延発行します。各QueryResponseページはitems()リストを持ちます。(手作業で行う場合は、lastEvaluatedKey()が空になるまで.exclusiveStartKey(...)として戻します。) - ソートキーの順序を逆にするには
.scanIndexForward(false)を追加します(デフォルトは昇順)。 - セカンダリインデックスをクエリするには
.indexName("...")を追加します。 - 素の Java オブジェクトがほしいですか?DynamoDB Enhanced Client(
software.amazon.awssdk.enhanced.dynamodb)は、アノテーション付き Bean クラスで同じクエリを公開します。
Do it visually
DynamoDB Expression Builder はキー条件を組み立て、実行可能なコードをコピーするので、プレースホルダーと値のマップを手書きする必要はありません。
GUI で実際のテーブルに対してクエリを実行するには(キー条件フォーム、ページネーションされたグリッド、コードとしてコピー)、DynoTable をダウンロードしてください。
Related examples
- DynamoDB Query in Go — AWS SDK for Go v2 による同じクエリ。
- DynamoDB Scan in Java — パーティションにキーで入れないとき。
- Query vs. Scan — なぜ
Queryが適切なデフォルトなのか。 - Key condition expressions — すべての有効なパーティション/ソートキー演算子。
- "Query condition missed key schema element" — キー条件が誤った属性を指定するか、パーティションキーを省いている。
- "Query key condition not supported" — contains や2つ目のソートキー条件のような、キー条件が使えない演算子。
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
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。