基于排序键的降序 DynamoDB 顺序

DynamoDB order in descending based on sort key

目前,我使用 Spring 引导 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);
}

谷歌搜索后,我发现我需要将 ScanIndexForward 设置为 true,但我仍然很困惑如何使用 DynamoDBMApper 实现它?

或者我是否需要使用任何低级别 class,例如 DynamoDB 或 AmazonDynamoDb?

最后,我自己找到了解决方案,感谢 @ydrall for the hint. As per his comment, ScanIndexForward can only be used with query option so I just updated with query. I had created DynamoDBQueryExpression object and updated the property using 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);
}

参考:How can I Scan an index in reverse in DynamoDB?