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 Clientsoftware.amazon.awssdk.enhanced.dynamodb)は、アノテーション付き Bean クラスで同じクエリを公開します。

Do it visually

DynamoDB Expression Builder はキー条件を組み立て、実行可能なコードをコピーするので、プレースホルダーと値のマップを手書きする必要はありません。

GUI で実際のテーブルに対してクエリを実行するには(キー条件フォーム、ページネーションされたグリッド、コードとしてコピー)、DynoTable をダウンロードしてください。

References

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

このリクエストをビジュアルに組み立てる

この操作を無料の DynamoDB クエリビルダーで組み立て — キー条件、フィルタ、インデックス、Limit、ソート順、ページネーションループ — 実行可能な SDK v3・CLI・boto3 のプログラムとしてコピーして戻れます。

DynamoDB クエリビルダーを開く

Console なしで DynamoDB を扱う

DynoTable は DynamoDB 向けの高速なデスクトップクライアントです — テーブルを閲覧し、SQL スタイルのクエリを実行し、アイテムをローカルで編集できます。