DynamoDB Query di Java (AWS SDK v2)

Query membaca setiap item yang berbagi satu partition key, secara opsional dipersempit dengan sort key. Di AWS SDK for Java 2.x Anda membangun QueryRequest dengan keyConditionExpression, dan queryPaginator bawaan mengikuti LastEvaluatedKey di setiap halaman hasil untuk Anda.

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

Penjelasan

  • keyConditionExpression — harus menyertakan kesetaraan pada partition key (#hashKey = :hashKeyValue) ditambah paling banyak satu kondisi sort-key (=, <, <=, >, >=, BETWEEN, atau begins_with). Alias #hashKey/#rangeKey di-resolve ke Artist/SongTitle via expressionAttributeNames (aman terhadap reserved word).
  • expressionAttributeValues — map :placeholder → typed-AttributeValue.
  • Paginasi — satu Query mengembalikan paling banyak 1 MB. ddb.queryPaginator(request) mengembalikan QueryIterable yang secara malas mengeluarkan request lanjutan saat Anda mengiterasi halaman; setiap halaman QueryResponse membawa daftar items(). (Melakukannya dengan tangan? Umpankan lastEvaluatedKey() kembali sebagai .exclusiveStartKey(...) hingga kosong.)
  • Tambahkan .scanIndexForward(false) untuk membalik urutan sort-key (menaik adalah default).
  • Kueri sebuah secondary index dengan menambahkan .indexName("...").
  • Lebih suka objek Java biasa? DynamoDB Enhanced Client (software.amazon.awssdk.enhanced.dynamodb) mengekspos kueri yang sama dengan kelas bean beranotasi.

Lakukan secara visual

DynamoDB Expression Builder menyusun key condition dan menyalin kode yang bisa dijalankan, jadi Anda tidak perlu menulis map placeholder dan value dengan tangan.

Untuk menjalankan kueri terhadap tabel nyata di GUI — form key-condition, grid berpaginasi, copy-as-code — unduh DynoTable.

Contoh terkait

References

Terakhir diverifikasi 2026-07-13 terhadap dokumentasi resmi AWS yang ditautkan di atas.

Bangun request ini secara visual

Susun operasi ini di DynamoDB Query Builder gratis — key condition, filter, index, Limit, urutan sortir, dan loop paginasi — lalu salin kembali sebagai program SDK v3, CLI, atau boto3 yang bisa dijalankan.

Buka DynamoDB Query Builder

Bekerja dengan DynamoDB tanpa Console

DynoTable adalah klien desktop yang cepat untuk DynamoDB — jelajahi tabel, jalankan query gaya SQL, dan edit Item secara lokal.