Java操作AWS DynamoDB删除item字段报AttributeValue类型异常如何解决
错误原因
你调用item.get("<Primary partition key name>")、item.get("<Primary sort key name>")拿到的是AttributeValue封装类型对象,而PrimaryKey构造方法要求传入的是对应字段的原生值(比如字符串、数字、布尔等Java基础/包装类型),直接传入AttributeValue类型就会触发类型不支持的异常。你两次写法报错都是同一个原因,和更新表达式本身无关。
额外说明:删除整字段用REMOVE才是正确语法,DELETE是用于删除集合类型字段中的部分元素,不需要替换。
修复方案
首先需要把AttributeValue转换为对应的原生值,不同类型调用不同的取值方法:
- 字符串类型:调用
.getS() - 数字类型:调用
.getN()返回字符串格式数字,可按需转为Integer/Long等 - 布尔类型:调用
.getBOOL() - 二进制类型:调用
.getB()
以下是修复后的代码示例(假设你的分区键和排序键都是字符串类型,可根据实际类型调整取值方法,同时补充了Scan分页处理逻辑,避免数据量超过1MB时只删除第一页数据):
Table table= dynamoDB.getTable("animals"); ScanRequest scanRequest = new ScanRequest().withTableName("animals"); ScanResult result = client.scan(scanRequest); while (true) { for (Map<String, AttributeValue> item : result.getItems()){ // 把AttributeValue转为原生值传入PrimaryKey PrimaryKey pk = new PrimaryKey( "<Primary partition key name>", item.get("<Primary partition key name>").getS(), "<Primary sort key name>", item.get("<Primary sort key name>").getS() ); UpdateItemSpec updateItemSpec = new UpdateItemSpec() .withPrimaryKey(pk) .withUpdateExpression("REMOVE dog"); table.updateItem(updateItemSpec); } // 检查是否还有下一页数据 if (result.getLastEvaluatedKey() == null) { break; } scanRequest.setExclusiveStartKey(result.getLastEvaluatedKey()); result = client.scan(scanRequest); }
内容的提问来源于stack exchange,提问作者PloniStacker
相关产品推荐
相关产品推荐

