当前位置: 首页 > 知识库问答 >
问题:

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

常明亮
2023-03-14

我正在执行对DynamoDB表的扫描,然后我需要将返回项中的相应属性添加到类型User的列表中(User具有单个构造函数User(String uuid))。代码当前成功扫描DB并返回扫描结果的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个答案

屈博
2023-03-14

我建议你开始使用现代和紧凑的列表迭代,这有助于避免使用旧迭代风格时的许多常见错误:

[...]

迭代器只是杂乱。此外,这也是犯错的机会。迭代器变量在每个循环中出现三次:这是两次出错的机会。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()));
    }

如果这还不起作用,它还可能提示实际的错误,因为您的代码假设类UserAccountstoString()返回uuid,可能是这样,也可能不是这样。通常的方法是使用getKey()getUuidAttribute()方法和相应的注释@DynamoDBHashKey@DynamoDBAttribute,如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()));
    }
 类似资料:
  • 问题内容: 我知道如何获取Android Wifi扫描,但我不知道从中制作列表适配器的最佳方法。我只想将SSID和BSSID从扫描的绑定到text1和text2。 我一直在做的样本 和: 问题答案: 试试这个代码 对于 在中添加这些权限

  • 我在做一件简单的事情,想不出该怎么做。我有一个使用方法的ArrayList,我想立即将结果添加到一个新的ArrayList中。 所以我想做类似的操作,但这不是正确的方法。 对我的代码的任何其他部分的PS建议也会很感激。谢谢!

  • 我正在尝试扫描DynamoDB故事,以便只获取筛选过的项。myTable有3列:L timestamp(String,PK),colors(String),userId(String) 因此,我只从userId列获取值。完全忽略列“colors”。 我做错了什么?

  • 问题内容: 我有一个Postgresql jsonb列,我想在我的应用程序中检索。我能够从jsonb列中检索一个普通的旧结构/指针,但无法检索结构/指针的切片。我有: 我得到的错误: 如果我取消注释“ selectJob(db)”并运行它就可以了。因此,我无法弄清楚如何扫描到结构/指针的一部分。有什么建议? 问题答案: 您跳过了JSON解码步骤。 您将以字符串形式从postgres获取jsonb字

  • 我有一个带有NodeJS 10.x的AWS Lambda。这个Lambda试图扫描基于“FilterExpression”的DynamoDB表。我正在使用DocumentClient执行“扫描”操作。尽管使用了各种方法,但我无法读取和迭代结果对象。 我尝试使用以下方法:

  • 问题内容: 我正在用SSRS编写一份报告。该数据集填充有MS SQL Server的SQL查询。它使用Union All查询几个相似的表。问题是有一些信息丢失。不同的表适用于不同的工作站点,但是这些表中的任何列都没有站点名称。标识站点的唯一方法是通过表名。在“全部合并”的结果的合并列中,无法分辨出哪些行来自哪个站点。 有没有一种方法可以更改我的查询以在结果中添加一列,该列将具有与每一行相关联的工作