使用 DynamoDBMapper 按列查询 DynamoDB

Query DynamoDB by column using DynamoDBMapper

我正在使用 loacalstack 和 dynamodb 设置。 Iv a table 有两列,一个 Id 和一个 name 列。我正在努力使用 DynamoDBMapper 通过 'name' 查询 table。下面是我的设置片段

实体>

@AllArgsConstructor
@NoArgsConstructor
@DynamoDBTable(tableName = "my-table")
public class Table {

   private String id;
   private String name;

   @DynamoDBHashKey(attributeName = "id")
   @DynamoDBAutoGeneratedKey
   public String getId() {
      return id;
   }

   public void setId(String id) {
      this.id = id;
   }

   @DynamoDBAttribute
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

@query >

public Table getByName(String name) {  
   return dynamoDBMapper.load(Table.class, name);
}
aws dynamodb create-table --endpoint-url=http://localstack:4569 --table-name my-table \
          --attribute-definitions AttributeName=id,AttributeType=S AttributeName=name,AttributeType=S \
          --key-schema AttributeName=id,KeyType=HASH AttributeName=name,KeyType=RANGE \

感谢任何帮助

显然您不能按名称查询 table,因为它不是 partition/hash 键。您可以使用扫描,也可以将 name 声明为 GSI 字段,然后对其进行查询。扫描命令如下:

dynamoDBMapper.scan(Table.class, new DynamoDBScanExpression());

以上命令将扫描整个table。阅读有关 DynamoDBScanExpression here 的信息,了解如何使用特定 name.

对其进行过滤

您可以像 name 添加过滤器,例如:

public Table getByName(String name) {  
    DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
    scanExpression.addFilterCondition("name", new Condition()                                           
       .withComparisonOperator(ComparisonOperator.EQ)                                                
       .withAttributeValueList(new AttributeValue().withS(name)));
    dynamoDBMapper.scan(Table.class, scanExpression);
}