Я работаю с DDB, который преобразует элемент с помощью DynamoDBMapper в ключ раздела с помощью DynamoDBTypeConvertedJson.
Так например:
public class TestObject{
private int id;
private String name;
}
@DynamoDBTable(tableName = TestTable.TABLE_NAME)
public class DynamoDBTestItem{
private testObj;
@DynamoDBIndexHashKey(globalSecondaryIndexName = TestTable.TEST_INDEX)
@DynamoDBTypeConvertedJson
public TestObject getTestObject() {
return testObject;
}
public void setTestObject(TestObject testObj) {
this.testObj = testObj;
}
}
Похоже, что DynamoDBTypeConvertedJson основан на Jackson JSON, который по умолчанию не сохраняет порядок свойств. Таким образом, мы можем сохранять элементы либо как
{\"id\":7,\"name\":\"ObjName\"} or {\"name\":ObjName,\"id\":\"7\"}
Когда я запрашиваю базу данных, я действительно вижу, что некоторые записи сначала имеют идентификатор, а некоторые - имя.
Теперь, когда я делаю следующее:
DynamoDBTestItem hashKey = new DynamoDBTestItem;
hashKey = new TestObj(7, "ObjName");
DynamoDBQueryExpression<DynamoDBTestItem> expression = new DynamoDBQueryExpression<DynamoDBTestItem>()
.withIndexName(TestTable.TEST_INDEX)
.withHashKeyValues(hashKey)
.withConsistentRead(false);
Мне любопытно, приведет ли этот запрос к пропущенному попаданию, потому что порядок свойств JSON не был сохранен. Итак, если «id» стоит перед «name» в сохраненной записи, но когда мы переходим к запросу, JSON решает поставить «name» перед «id», приведет ли это к пропущенному запросу?
Кажется, что теоретически это могло бы произойти, но я не видел, чтобы это происходило в этой системе, поэтому мне любопытно. Системе здесь просто везет.
Спасибо

В аннотации @DynamoDBTypeConvertedJson (исходный код) используется Fastxml jackson ObjectMapper, для которого по умолчанию установлено значение сортировать свойства по алфавиту (с некоторыми оговорками, которые упоминаются в связанной документации).
В случае, который вы описали, порядок всегда будет одинаковым, но можно создать случай, когда порядок не согласован.