Java ValidationException:“验证异常”;提供的键元素与架构不匹配;执行dynmoDB batchWriteItem操作时出错

Java ValidationException:“验证异常”;提供的键元素与架构不匹配;执行dynmoDB batchWriteItem操作时出错,java,amazon-web-services,amazon-dynamodb,Java,Amazon Web Services,Amazon Dynamodb,我正在DynamoDb的多个表上执行batchWriteItem操作。我的代码如下- BatchWriteItemOutcome outcome = null; try { TableWriteItems userTableWriteItems = new TableWriteItems("User") .withHashAndRangeKeysToDelete("clientAccountKey", "userKey", clie

我正在DynamoDb的多个表上执行batchWriteItem操作。我的代码如下-

    BatchWriteItemOutcome outcome = null;
    try {
        TableWriteItems userTableWriteItems = new TableWriteItems("User")
                .withHashAndRangeKeysToDelete("clientAccountKey", "userKey", clientAccountKey, "xyzUserKey"); // Working for this Method

        TableWriteItems PosTrackingWriteItems = new TableWriteItems("PosTracking")
                .withHashOnlyKeysToDelete("userKey", "xyzUserKey"); // ** Not Working for this **

        outcome = dynamoDb.batchWriteItem (
                userTableWriteItems,
                PosTrackingWriteItems);     
    }
    catch(Exception e){
        System.out.println("Exception in Removing User Data !!! ");
        e.printStackTrace();
    }
如果我只是用hashandrangekeystedelete指定batchWrite delete
,在这里我同时指定了Hash和Range key,那么它就工作了。
但它不适用于
with hashonlykeystode
方法,在该方法中,我将HashKey name和HashKey值指定为参数。我一直得到这样的例外:

com.amazonaws.services.dynamodbv2.model.amazondynamodexception:提供的键元素与架构不匹配。服务:AmazonDynamoDBv2;身份代码:400;错误代码:ValidationException


我的后跟踪表将HashKey(String)作为userKey,我也从方法中传递String。我在这个表中还有一个名为clientAccountKey(String)的GSI。我尝试对TableWriteItems使用
AddHashOnlyPrimaryKeyDelete
&
.addPrimaryKeyToDelete
方法,但也不起作用

后跟踪表的主键模式是什么?它有测距键吗?如果是这样,则需要同时指定哈希键和范围键。DynamoDB不允许仅使用散列键删除项目-必须指定完整的主键,包括范围键。

后跟踪表的主键模式是什么?它有测距键吗?如果是这样,则需要同时指定哈希键和范围键。DynamoDB不允许您仅使用散列键删除项目-您必须指定包括范围键在内的完整主键。

那么,使用HashOnlyKeysToDelete的此方法有什么用,或者如何使用此方法。我检查了文档,它说只传递hashKey name和Hash key value对象。甚至我也用mapper试过了。只需使用哈希键即可成功删除项目。
HashMap eav=new HashMap();eav.put(“:v1”,新的AttributeValue().with(userKey));DynamoDBQueryExpression queryExpression=new DynamoDBQueryExpression()。withKeyConditionExpression(“userKey=:v1”)。WithExpressionAttributeValue(eav);List ddbResults=mapper.query(PosTracking.class,queryExpression);mapper.batchDelete(ddbResults)withHashOnlyKeysToDelete的Javadoc说“用于指定要从当前表中删除的多个仅散列主键”。因此,它用于从主键仅包含散列键的表中删除项。您发布的代码示例之所以有效,是因为您首先使用相同的哈希键(这是允许的)查询所有项目,然后将所有这些项目传递给batchDelete。这些项将同时包含哈希值和范围键值,因此删除works@bwinant-非常感谢你的回复,我明白你的意思了。您知道有什么更好的方法可以从多个表中批量删除1000行吗?谢谢你的帮助。谢天谢地,真的没有一个好办法。批处理操作最多可以有25个删除请求,因此如果您需要删除1000个项目,您仍然需要将其拆分为多个批。在处理之前,您需要查询或了解所有密钥,然后使用HashOnlyKeysToDelete这个方法
有什么用,或者我如何使用它。我检查了文档,它说只传递hashKey name和Hash key value对象。甚至我也用mapper试过了。只需使用哈希键即可成功删除项目。
HashMap eav=new HashMap();eav.put(“:v1”,新的AttributeValue().with(userKey));DynamoDBQueryExpression queryExpression=new DynamoDBQueryExpression()。withKeyConditionExpression(“userKey=:v1”)。WithExpressionAttributeValue(eav);List ddbResults=mapper.query(PosTracking.class,queryExpression);mapper.batchDelete(ddbResults)withHashOnlyKeysToDelete的Javadoc说“用于指定要从当前表中删除的多个仅散列主键”。因此,它用于从主键仅包含散列键的表中删除项。您发布的代码示例之所以有效,是因为您首先使用相同的哈希键(这是允许的)查询所有项目,然后将所有这些项目传递给batchDelete。这些项将同时包含哈希值和范围键值,因此删除works@bwinant-非常感谢你的回复,我明白你的意思了。您知道有什么更好的方法可以从多个表中批量删除1000行吗?谢谢你的帮助。谢天谢地,真的没有一个好办法。批处理操作最多可以有25个删除请求,因此如果您需要删除1000个项目,您仍然需要将其拆分为多个批。你需要事先查询或知道所有的钥匙