Каков текущий метод, использующий DynamoDBmapper и DynamoDBQueryExpression для запроса глобального вторичного индекса, сортировки по индексу сортировки и возврата лучших результатов n?
Первое пробное решение, показанное здесь: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query
Однако withKeyConditionExpression больше не существует для DynamoDBQueryExpression.Затем я попробовал пример, показанный здесь: Как запросить базу данных Dynamo, имеющую GSI только с hashKeys, используя DynamoDBMapper
, который использует setHashKeyValues, но я получаю следующую ошибку: com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMappingException: публичное свойство хеш-ключа с нулевым параметром должно быть аннотировано интерфейсом com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBHashKey
Если я получаю результаты сканирования, я могу получить результаты, поэтому я думаю, что разрешения правильные:
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS(Leaderboard));
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withFilterExpression("Leaderboard = :val1") // and Ranking <= :val2")
.withExpressionAttributeValues(eav);
DynamoDBmapper объект выглядит следующим образом.Я не включил никаких атрибутов первичного ключа из основной таблицы, только это подмножество.
@DynamoDBTable(tableName = "Users")
public class DynamoLeaderboard implements Serializable {
private String leaderboard;
private String userName;
private int ranking;
public DynamoLeaderboard() {}
@DynamoDBIndexHashKey(globalSecondaryIndexName = "Leaderboard-Ranking-index", attributeName = "Leaderboard")
public String getLeaderboard() {
return leaderboard;
}
public void setLeaderboard(final String leaderboard) {
this.leaderboard = leaderboard;
}
@DynamoDBIndexRangeKey(globalSecondaryIndexName = "Leaderboard-Ranking-index", attributeName = "Ranking")
public int getRanking() {
return ranking;
}
public void setRanking(int ranking) {
this.ranking = ranking;
}
@DynamoDBAttribute(attributeName = "UserName")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
Тогда запрос называется:
final DynamoLeaderboard tmpLeaderboard = new DynamoLeaderboard();
tmpLeaderboard.setLeaderboard("0");
Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":val1", new AttributeValue().withS("0"));
DynamoDBQueryExpression<DynamoLeaderboard> queryExpression = new DynamoDBQueryExpression<DynamoLeaderboard>();
queryExpression.withIndexName("Leaderboard-index");
queryExpression.setHashKeyValues(tmpLeaderboard);
queryExpression.withConsistentRead(false);
scanResult = mapper.query(DynamoLeaderboard.class, queryExpression);
Комментарии о том, что вызывает нольисключение ключа хэш-свойства?Связано ли это с установкой основного хеш-ключа таблицы против хеш-ключа GSI?
Рекомендации по текущему и правильному способу выполнения запросов к GSI?
Очень приветствуется!