基于排序键的降序 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?
目前,我使用 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?