Порядок DynamoDB по убыванию на основе ключа сортировки

В настоящее время я использую Spring boot с DynamoDB и использую DynamoDBMapper для всех операций с БД. Прямо сейчас он сортируется в порядке возрастания на основе ключа сортировки (имя поля id). Как я могу сортировать в порядке убывания на основе значения ключа сортировки?

Текущий код:

@Override
public PageImpl<Order> getCustomerOrders(Pageable pageable) {

    List<Order> orders = new ArrayList<>();


    Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();


    DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
    List<String> exp = new ArrayList<>();


    // filters

    if (!exp.isEmpty())
        scanExpression
                .withFilterExpression(String.join(" AND ", exp)).withExpressionAttributeValues(eav);


    PaginatedScanList<Order> scan = mapper.scan(Order.class, scanExpression);




    int start = (int) pageable.getOffset();
    int size = scan.size();
    int end = (start + pageable.getPageSize()) > size ? size : (start + pageable.getPageSize());

    if (start < size)
        for (Order o : scan.subList(start, end)) {
            orders.add(o);
        }

    return new PageImpl<Order>(orders, pageable, size);
}

После некоторого поиска в Google я обнаружил, что мне нужно установить ScanIndexForward как true, но все же я не понимаю, как я могу добиться этого с помощью DynamoDBBMApper?

Или мне нужно использовать любой низкоуровневый класс, такой как DynamoDB или AmazonDynamoDb?


person Pranav C Balan    schedule 22.03.2019    source источник
comment
Насколько я знаю, ScanIndexForward работает только с запросом, а не сканированием. Что-то подобное здесь: stackoverflow.com/questions/26250095/.   -  person ydrall    schedule 22.03.2019
comment
@ydrall: спасибо за быстрый ответ .... Посмотрю .... ????   -  person Pranav C Balan    schedule 22.03.2019


Ответы (1)


Наконец, я сам нашел решение. Спасибо @ydrall за подсказку. Согласно его комментарию, ScanIndexForward можно использовать только с параметром запроса, поэтому я только что обновил запрос. Я создал DynamoDBQueryExpression и обновил свойство с помощью setScanIndexForward метод ( false ).

Полный Java-код:

@Override
public PageImpl<Order> getAllProgramOrder(Pageable pageable, OrderFilter filter) {
    List<Order> orders = new ArrayList<>();


    DynamoDBQueryExpression<Order> queryExpression = new DynamoDBQueryExpression<Order>();

    queryExpression.setScanIndexForward(false);


    Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
    eav.put(":val1", new AttributeValue().withS(authenticationFacade.getProgramId()));

    queryExpression.withKeyConditionExpression("hashKey = :val1 ")
            .withExpressionAttributeValues(eav);

    PaginatedQueryList<Order> scan = mapper.query(Order.class, queryExpression);


    int start = (int) pageable.getOffset();
    int size = scan.size();
    int end = (start + pageable.getPageSize()) > size ? size : (start + pageable.getPageSize());

    if (start < size)
        for (Order o : scan.subList(start, end)) {
            orders.add(o);
        }

    return new PageImpl<Order>(orders, pageable, size);
}

Ссылка: Как я могу сканировать индекс наоборот в DynamoDB?

person Pranav C Balan    schedule 22.03.2019