java中的batchGetItem API出错

时间:2012-02-13 02:26:06

标签: java amazon-web-services amazon-dynamodb

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

  

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

架构:

  

表:每日

     

哈希键:CustId(String)

     

范围键:Dated(Number)

数据:

  

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);

任何线索?

1 个答案:

答案 0 :(得分:8)

您已将Hash and Range Type Primary Key的范围属性定义为 Number 类型,但是通过withS()将其属性值作为 String 类型为您准备请求:

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())));

不可否认,基于 String 参数的DynamoDB data types提交的隐式弱类型不能完全简化开发;)