如何将DynamoDB扫描结果添加到对象列表?

时间:2012-05-13 13:15:36

标签: java iterator amazon-dynamodb

我正在对DynamoDB表执行扫描,然后我需要将返回项中的相应属性添加到类型为User的列表中(User具有单个构造函数User(String uuid)) 。代码当前成功扫描数据库并返回List扫描结果。但是我的迭代似乎由于某种原因返回null。

    AmazonDynamoDBClient client = dynamoClient.getDynamoClient();
    DynamoDBMapper mapper = new DynamoDBMapper(client);

    try {
        DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();

        Map<String, Condition> scanFilter = new HashMap<String, Condition>();
        Condition scanCondition = 
            new Condition().withComparisonOperator(ComparisonOperator.NOT_NULL);
        scanFilter.put("uuid", scanCondition);
        scanExpression.setScanFilter(scanFilter);

        List scanResults = mapper.scan(UserAccounts.class, scanExpression);

        for (Iterator it = scanResults.iterator(); it.hasNext();) {
            //User user = (User) it.next();
            allUserSummary.add(new User(scanResults.get(1).toString()));
        }
    } catch (Exception e) {
        // TODO
    }

1 个答案:

答案 0 :(得分:2)

我建议你通过The For-Each Loop开始使用现代和紧凑的列表迭代,这有助于在使用旧的迭代样式时避免许多常见错误:

  

[...]

     

迭代器只是杂乱无章。此外,这是一个机会   错误。迭代器变量在每个循环中出现三次:即   有两次机会弄错了。 for-each构造摆脱了   杂乱和错误的机会。以下是该示例的外观   与for-each构造:

void cancelAll(Collection<TimerTask> c) {
    for (TimerTask t : c)
        t.cancel();
}

将此应用于您的用例会产生以下结果:

    List<UserAccounts> scanResults = mapper.scan(UserAccounts.class, scanExpression);

    for (UserAccounts userAccounts : scanResults) {
        allUserSummary.add(new User(userAccounts.toString()));
    }

如果这不起作用,它也可能暗示实际错误,只要您的代码假定toString()UserAccounts返回 uuid ,可能是也可能不是。通常的方法是使用getKey()getUuidAttribute()方法以及相应的注释@DynamoDBHashKey@DynamoDBAttribute,如Class DynamoDBMapper的示例所示,例如:

@DynamoDBTable(tableName = "UserAccounts")
 public class UserAccounts{     
     private String key; // or uuid right away

     @DynamoDBHashKey
     public String getKey() {
         return key;
     }

     public void setKey(String key) {
         this.key = key;
     }

     // ...
 }

这显然会为您的示例提供以下内容:

    List<UserAccounts> scanResults = mapper.scan(UserAccounts.class, scanExpression);

    for (UserAccounts userAccounts : scanResults) {
        allUserSummary.add(new User(userAccounts.getKey()));
    }