У меня есть таблица с lastModificationTimestamp
:
@DynamoDBTable(tableName = Association.TABLE_NAME)
public class Association {
...
@DynamoDBAttribute
Long lastModificationTimestamp;
}
Я хочу сохранить запись условно, то есть, учитывая запись r
:
- Если нет записи с PK
r
, вставьте r
; - Если существует запись
s
с тем же PK, что и r
, и s.lastModificationTimestamp >= r.lastModificationTimestamp
, ничего не делать; - Если существует запись
s
с тем же PK, что и r
, и s.lastModificationTimestamp < r.lastModificationTimestamp
, перезаписать s
с помощью r
.
Я хочу сделать это, используя DynamoDBMapper
. У меня сложилось впечатление, что это можно сделать с помощью условной проверки всего за один запрос:
final Map<String, ExpectedAttributeValue> expectedAttributes = new HashMap<>();
expectedAttributes.put("lastModificationTimestamp",
new ExpectedAttributeValue()
.withValue(new AttributeValue(r.getLastModificationTimestamp.toString()))
.withComparisonOperator(ComparisonOperator.LT));
mapper.save(r, new DynamoDBSaveExpression().withExpected(expectedAttributes));
Я интерпретирую это как «ожидаю, что lastModificationTimestamp
сохраненной записи будет меньше r
's lastModificationTimestamp
.
Однако, это терпит неудачу с ConditionalCheckFailedException
. Я попытался использовать ComparisonOperator.GE
, в случае, если моя интерпретация документов была противоположной, но это не так, как хорошо, поэтому я подозреваю, что я делаю что-то ужасно неправильно. Мой объект DynamoDBMapper
настроен с параметрами по умолчанию. Я использую AWS SDK Java 1.11.