Текущий метод для запроса GSI с DynamoDBmapper, сортировки по ключу сортировки и возврата n результатов? - PullRequest
0 голосов
/ 05 июня 2019

Каков текущий метод, использующий 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?

Очень приветствуется!

1 Ответ

0 голосов
/ 06 июля 2019

Вам необходимо добавить ключевые атрибуты главной таблицы в вашу модель.DynamoDBMapper не работает, потому что аннотированный класс @DynamoDBTable не имеет атрибута @DynamoDBHashKey.

В качестве альтернативы, вы можете попробовать изменить @DynamoDBTable на @DynamoDBDocument, хотя я менее уверен, что это сработает.

...