Java (AWS SDK v2) での DynamoDB GetItem

AWS SDK for Java 2.x はアイテムを、イミュータブルなビルダーで組み立てる Map<String, AttributeValue> としてモデル化します。その慣習のうち 2 つが他の多くの SDK と異なります。数値が文字列として型付けされることと、レスポンスのコレクションが決して null にならないことです。

リクエスト自体には、他と同じく完全なプライマリキーが必要です。

コード

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.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;

public class GetItemExample {
    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());

            Map<String, String> names = new HashMap<>();
            names.put("#proj0", "Artist");
            names.put("#proj1", "SongTitle");
            names.put("#proj2", "AlbumTitle");
            names.put("#proj3", "Year");

            GetItemRequest request = GetItemRequest.builder()
                    .tableName("Music")
                    .key(key)
                    .projectionExpression("#proj0, #proj1, #proj2, #proj3")
                    .expressionAttributeNames(names)
                    .build();

            Map<String, AttributeValue> item = ddb.getItem(request).item();
            if (item.isEmpty()) {
                System.out.println("Item not found");
            } else {
                System.out.println(item);
            }
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
        }
    }
}

解説

  • n()String を取りますAttributeValue.builder().n(1994) はコンパイルできません。Javadoc が理由を述べています: "Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries." つまり n("1994") であり、戻ってきたときのパースは自分の仕事です。
  • item() は決して null を返しません。見つからない場合は空のマップになるので、判定は isEmpty() です。「サービスが何も返さなかった」と「サービスが空のマップを返した」を区別したいなら hasItem() を呼びます。SDK は空のコレクションを自動生成するので、それを見通せるのは hasItem() だけです。
  • 返ってくるマップはイミュータブルです。Javadoc は、これを変更すると UnsupportedOperationException が投げられると明記しています。編集する予定があるなら、まず HashMap にコピーしましょう。
  • エイリアスのマップをローカルで検証するものは何もありませんexpressionAttributeNames はただの Map<String, String> です。ここで #proj3 が必要なのは Year予約語だからで、宣言したのに一度も参照しないエイリアスはそれ自体がサービス側のエラーになります: 「Value provided in ExpressionAttributeNames unused in expressions」
  • アプリケーション全体でクライアントは 1 つ。AWS は端的にこう述べています: "Service clients in the AWS SDK for Java 2.x are thread-safe." try-with-resources のブロックは一発きりの main には合いますが、長時間動くサービスでは起動時にクライアントを作り、リクエストごとに閉じないでください。
  • .consistentRead(true)読み取りコストを 2 倍にし、GSI では拒否されます。AttributeValue のマップが煩わしくなってきたときは DynamoDB Enhanced Clientsoftware.amazon.awssdk.enhanced.dynamodb)の出番で、これと同じ低レベル呼び出しの上でアイテムをアノテーション付きの Bean にマッピングします。

ビジュアルに行う

この読み取りが 0.5 キャパシティユニットで済むか 1 になるかは、アイテムが 4 KB に収まるかどうか次第です。アイテムサイズ計算ツールは、貼り付けたアイテムをその境界に照らして測ります。

DynoTable は同じアイテムを普通の行として表示し、グリッドの裏にあるクエリを、これらのビルダーで組み立てた Java プログラムとしてエクスポートします。DynoTable をダウンロード

関連する例

参考資料

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

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。