5

我正在查询的实体有一个HashKey& 一个RangeKey(数字)。当我使用batchGetItem它时,我收到以下错误:

AWS 错误代码:ValidationException,AWS 错误消息:一个或多个参数值无效:位置和架构之间的属性类型不匹配

架构:

表:每日

哈希键:CustId(字符串)

范围键:日期(数字)

数据:

CustId : VisioNerdy

日期:1329071400000

代码:

  List<Key> fkeys = new ArrayList<Key>(); //tableName="Daily", keys=["VisioNerdy"], ranges=[1329071400000]
    Map<String, KeysAndAttributes> requestItems = new HashMap<String, KeysAndAttributes>();
    for(int i = 0; i < keys.size(); i++)
    {
        String key = keys.get(i);
        if(ranges == null)
            fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key)));
        else
            fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))
                    .withRangeKeyElement(new AttributeValue().withS(ranges.get(i).toString())));
    }
    requestItems.put(tableName, new KeysAndAttributes().withKeys(fkeys));
    BatchGetItemRequest batchGetItemRequest = new BatchGetItemRequest().withRequestItems(requestItems);
    BatchGetItemResult result = client.batchGetItem(batchGetItemRequest);

有什么线索吗?

4

1 回答 1

8

您已将Hash 和 Range Type Primary Key的 range 属性定义为Number类型,但通过StringwithS()类型为您的请求准备其属性值:

fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))
        .withRangeKeyElement(new AttributeValue().withS(ranges.get(i).toString())));

将withS( String s )更改为withN( String s )应该相应地解决您的问题(令人困惑的是,这两种方法都需要String类型的参数):

fkeys.add(new Key().withHashKeyElement(new AttributeValue().withS(key))
        .withRangeKeyElement(new AttributeValue().withN(ranges.get(i).toString())));

诚然,仅基于字符串参数提交的DynamoDB 数据类型的隐式弱类型并不能完全简化开发;)

于 2012-02-14T11:35:45.897 回答