Java(AWS SDK v2)中的 DynamoDB Query

Query 读取共享同一个分区键的每个项目,并可选地按排序键收窄。在 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());
        }
    }
}

说明

  • keyConditionExpression — 必须包含分区键上的相等条件(#hashKey = :hashKeyValue),外加至多一个排序键条件(=<<=>>=BETWEENbegins_with)。#hashKey/#rangeKey 别名通过 expressionAttributeNames 解析为 Artist/SongTitle(保留字安全)。
  • expressionAttributeValues:placeholder → 带类型 AttributeValue 映射。
  • 分页 — 单次 Query 最多返回 1 MB。ddb.queryPaginator(request) 返回一个 QueryIterable,随着你迭代各页而惰性发起后续请求;每个 QueryResponse 页携带一个 items() 列表。(想手动做?把 lastEvaluatedKey() 作为 .exclusiveStartKey(...) 送回,直到它为空。)
  • 加上 .scanIndexForward(false) 可反转排序键顺序(升序是默认值)。
  • 通过添加 .indexName("...") 来查询二级索引。
  • 更想用普通 Java 对象?DynamoDB Enhanced Clientsoftware.amazon.awssdk.enhanced.dynamodb)用带注解的 bean 类暴露同样的查询。

可视化操作

DynamoDB Expression Builder 会组装键条件并复制可运行代码,让你无需手写占位符和值映射。

想在 GUI 中针对真实表运行查询——键条件表单、分页网格、复制为代码——请下载 DynoTable

相关示例

References

Last verified 2026-07-13 against the official AWS documentation linked above.

可视化构建此请求

在免费的 DynamoDB 查询构建器中组装此操作 —— 键条件、筛选、索引、Limit、排序方向和分页循环 —— 再把它作为可运行的 SDK v3、CLI 或 boto3 程序复制回来。

打开 DynamoDB 查询构建器

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。