2012-02-13 4 views
5

L'entité que j'interroge a un HashKey & un RangeKey (nombre). Quand je l'utilise batchGetItem sur elle, je reçois l'erreur suivante:Erreur dans l'API batchGetItem dans Java

AWS Error Code: ValidationException, AWS Error Message: One or more parameter values were invalid: Mismatching attribute types between location and schema

Schéma:

Table: Daily

Hash Key: CustId (String)

Range Key: Dated (Number)

données:

CustId : VisioNerdy

Dated : 1329071400000

code:

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

Des indices?

+0

Pourriez-vous s'il vous plaît ajouter votre (éventuellement condensé) schéma et le fragment de code l'exécution de votre requête pour faciliter une analyse? Merci! –

+1

Avoir modifié la question pour les inclure. Merci! –

+0

Vous avez "if (ranges == null)" mais si une Table a une clé de plage, une valeur est requise; vous ne pouvez pas l'omettre. –

Répondre

8

Vous avez défini l'attribut de portée de votre Hash and Range Type Primary Key en tant que type Nombre, mais préparer sa valeur d'attribut via withS() en tant que type chaîne pour votre demande:

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

Changement withS(String s)-withN(String s) devrait remédier à votre problème en conséquence (avec confusion, les deux méthodes nécessitent un paramètre de type Chaîne):

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

Certes, le typage faible implicite de la soumission DynamoDB data types basée sur Chaîne paramètres seulement facilité pas exactement en développement;)

+0

J'ai compris! Merci! –

+0

@Mani: Je suis heureux de pouvoir vous aider - pourriez-vous s'il vous plaît remettre en question et surtout accepter la réponse, si elle a résolu votre problème? Ceci est souhaité ici, à la fois pour faire disparaître votre problème et faire de la place aux problèmes ouverts des autres, ainsi que pour s'assurer que les utilisateurs restent motivés à s'entraider;) Voir la FAQ [Qu'est-ce que la réputation?] (Http: // stackoverflow .com/faq # réputation) pour plus de détails - merci! –

+1

Fait! Merci de m'avoir guidé! –