使用 UpdateItemRequest 更新 dynamoDb 项目的用户定义对象

Update User defined object of the dynamoDb item using UpdateItemRequest

我们有一个 DynamoDB table 测试,它有一个属性模板。下面是 class 定义。我想根据特定条件更新模板属性或其某些属性。我尝试使用 UpdateItemRequest 做同样的事情,但无法找到更新模板属性的方法,因为所有内容都被转换为字符串、数字或字节。

参考代码。

@DynamoDbBean
public class Test implements NoSQLEntity {
        
private String name;
private Template template;
        
@DynamoDbAttribute("name")
public String getName() {
    return name;
}
        
@DynamoDbAttribute("template")
public Template getTemplate() {
     return template;
}   
}

   @DynamoDbBean
   public class Template {

   private String pk;
   private String name;
   private List<String> demo;

   @DynamoDbAttribute("pk")
   public String getPk() {
        return this.pk;
   }
            
   @DynamoDbAttribute("name")
   public String getName() {
         return name;
   }

   @DynamoDbAttribute("demo")
   public List<String> getdemo() {
       return demo;
   } 

}

示例更新代码:

UpdateItemRequest request = UpdateItemRequest.builder()
            .tableName("Test")
            .key(itemKey)
            .updateExpression("SET tmpt = :tmt")
            .expressionAttributeValues(expressionValues)
            .build();

这里我无法使用 AttributeValue 构建 :tmt。有人可以指导我吗?

这是来自工程团队的自述文件,您可能会觉得有用:

https://github.com/aws/aws-sdk-java-v2/tree/master/services-custom/dynamodb-enhanced

DynamoDb Enhanced 提供 DefaultAttributeConverterProvider,它将识别一个转换器,该转换器可以将特定的 Java 类型转换为可用于更新项目的 AttrbuteValue 类型。

示例代码:

    AttributeValue value = DefaultAttributeConverterProvider.create()
            .converterFor(EnhancedType.documentOf(Template.class, 
             TableSchema.fromBean(Template.class)))
            .transformFrom(template);

然后可以将此值放入 expressionValues 映射中。

   Map<String, AttributeValue> expressionValues = new HashMap<>();
    expressionValues.put(":tmt", value);

   UpdateItemRequest request = UpdateItemRequest.builder()
        .tableName("Test")
        .key(itemKey)
        .updateExpression("SET tmpt = :tmt")
        .expressionAttributeValues(expressionValues)
        .build();