DynamoDB запрос на GSI, чтобы найти последний элемент
Я пытаюсь выполнить запрос на DynamoDB, чтобы предоставить мне последний элемент на основе xField в XField Index
DyanmoDB pojo
@EqualsAndHashCode(exclude = "rvn")
@DynamoDBTable(tableName = "Test")
public class Test {
@DynamoDBHashKey(attributeName = "uniqueId")
@DynamoDBAutoGeneratedKey
private String uniqueId;
@DynamoDBIndexHashKey(globalSecondaryIndexName = "xField-index", attributeName = "xField")
private String xField;
@DynamoDBAutoGeneratedTimestamp(strategy = DynamoDBAutoGenerateStrategy.CREATE)
@DynamoDBAttribute(attributeName = "createdAt")
private Date createdAt;
@DynamoDBAutoGeneratedTimestamp(strategy = DynamoDBAutoGenerateStrategy.ALWAYS)
@DynamoDBRangeKey(attributeName = "lastUpdatedAt")
private Long lastUpdatedAt;
@DynamoDBVersionAttribute(attributeName = "rvn")
private Long rvn;
}
Ключ Hash таблицы генерируется автоматически с помощью аннотации @DynamoDBAutoGeneratedKey. Я искал в Интернете и обнаружил, что могу использовать withScanIndexForward, но когда я глубоко погружаюсь, я узнаю, как работает withScanIndexForward:
Элементы с одинаковым значением ключа раздела хранятся в отсортированном порядке по ключу сортировки. Если тип данных ключа сортировки - Число, результаты сохраняются в числовом порядке. Для типа String результаты сохраняются в порядке байтов UTF-8. Для типа Binary DynamoDB обрабатывает каждый байт двоичных данных как беззнаковый.
Если ScanIndexForward имеет значение true, DynamoDB возвращает результаты в порядке их сохранения (по значению ключа сортировки). Это поведение по умолчанию. Если ScanIndexForward имеет значение false, DynamoDB считывает результаты в обратном порядке по значению ключа сортировки, а затем возвращает результаты клиенту.
В моем случае ключа сортировки нет. Итак, я получаю случайные данные, когда я запускаю нижеупомянутый запрос.
final Map<String, String> attributeNameMap = new HashMap<>();
attributeNameMap.put("#t", "XField");
final Map<String, AttributeValue> attributeValueMap = new HashMap<>();
attributeValueMap.put(":v1", new AttributeValue().withS(value));
DynamoDBQueryExpression<SkillOperationData> expression = new
DynamoDBQueryExpression<Test>()
.withIndexName("XField-index")
.withConsistentRead(false)
.withKeyConditionExpression("#t = :v1")
.withScanIndexForward(false)
.withLimit(1);
Может кто-нибудь помочь мне найти способ решить эту проблему.