5

クエリを実行しているエンティティにはHashKey& RangeKey(数値) があります。使用batchGetItemすると、次のエラーが発生します。

AWS エラー コード: ValidationException、AWS エラー メッセージ: 1 つ以上のパラメータ値が無効でした: ロケーションとスキーマの間で属性タイプが一致しません

スキーマ:

表: 日次

ハッシュキー: 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 に答える