Per an Amazonian, this is not possible: https://forums.aws.amazon.com/thread.jspa?threadID=146102&tstart=0
A workaround that worked for my use case, though, was to just specify a RangeKeyCondition
greater than the last retrieved object's timestamp. Here's the idea:
Condition hashKeyCondition = new Condition();
hashKeyCondition.withComparisonOperator(ComparisonOperator.EQ).withAttributeValueList(new AttributeValue().withS(hashKeyAttributeValue));
Condition rangeKeyCondition = new Condition();
rangeKeyCondition.withComparisonOperator(ComparisonOperator.GT).withAttributeValueList(new AttributeValue().withN(timestamp.toString()));
Map<String, Condition> keyConditions = new HashMap<String, Condition>();
keyConditions.put(MappedItem.INDEXED_ATTRIBUTE_NAME, hashKeyCondition);
keyConditions.put(MappedItem.TIMESTAMP, rangeKeyCondition);
QueryRequest queryRequest = new QueryRequest();
queryRequest.withTableName(tableName);
queryRequest.withIndexName(MappedItem.INDEX_NAME);
queryRequest.withKeyConditions(keyConditions);
QueryResult result = amazonDynamoDBClient.query(queryRequest);
List<MappedItem> mappedItems = new ArrayList<MappedItem>();
for(Map<String, AttributeValue> item : result.getItems()) {
MappedItem mappedItem = dynamoDBMapper.marshallIntoObject(MappedItem.class, item);
mappedItems.add(mappedItem);
}
return mappedItems;
Note that the marshallIntoObject
method is deprecated in favor of a protected method in the DynamoDBMapper
class, but it's easy enough to write a marshaller were a future upgrade to break the mapping.
Not as elegant as using the mapper but it accomplishes the same thing.