我正在创建一个 DAO 类,它有一个 API 可以逐页获取产品。对 API 的请求将包含一个过滤器列表。过滤对原始和字符串属性按预期工作。
@Getter
@Setter
@DynamoDBTable(tableName = "Entity")
public abstract class EntityDO {
@DynamoDBHashKey(attributeName = "uid")
@DynamoDBAutoGeneratedKey
private String uid;
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@DynamoDBDocument
@DynamoDBTable(tableName = "CATEGORIES")
public class CategoryDO extends EntityDO {
@DynamoDBAttribute(attributeName = "name")
private String name;
@DynamoDBAttribute(attributeName = "description")
private String description;
@DynamoDBAttribute(attributeName = "imageUrl")
private String imageUrl;
}
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@DynamoDBTable(tableName = "bs-PRODUCTS")
public class ProductDO extends EntityDO {
@DynamoDBAttribute(attributeName = "name")
private String name;
@DynamoDBAttribute(attributeName = "description")
private String description;
@DynamoDBAttribute(attributeName = "longDescription")
private String longDescription;
@DynamoDBAttribute(attributeName = "category")
private CategoryDO category;
@DynamoDBAttribute(attributeName = "imageUrl")
private String imageUrl;
@DynamoDBAttribute(attributeName = "mrp")
private float mrp;
@DynamoDBAttribute(attributeName = "discount")
private float discount;
@DynamoDBAttribute(attributeName = "tags")
private List<String> tags;
}
public class ProductDAO extends EntityDAO<ProductDO> {
@Autowired
private Logger logger;
@Autowired
private DynamoDBMapper dynamoDBMapper;
@Autowired
private Map<Filter.Operation, ComparisonOperator> operatorMap;
@Autowired
private ProductConverter converter;
@Override
public Optional<ProductDO> get(String id) {
return Optional.ofNullable(dynamoDBMapper.load(ProductDO.class, id));
}
@Override
public List<ProductDO> getAll() {
return dynamoDBMapper.scan(ProductDO.class, new DynamoDBScanExpression());
}
@Override
public List<ProductDO> get(List<Filter> filters, String previousPageLastKey, int count) {
Map<String, Condition> scanFilters = new HashMap<>();
for (Filter filter: filters) {
ComparisonOperator comparisonOperator = operatorMap.get(filter.getOperation());
Condition condition = new Condition()
.withComparisonOperator(comparisonOperator)
.withAttributeValueList(new AttributeValue().withS(filter.getAttributeValue()));
scanFilters.put(filter.getAttributeName(), condition);
}
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
.withLimit(count)
.withScanFilter(scanFilters);
if (previousPageLastKey != null) {
Map<String, AttributeValue> exclusiveStartKey = new HashMap<>();
exclusiveStartKey.put(Constants.UID, new AttributeValue().withS(previousPageLastKey));
scanExpression.setExclusiveStartKey(exclusiveStartKey);
}
return dynamoDBMapper.scan(ProductDO.class, scanExpression);
}
}
ScanExpression 中应更改哪些内容以过滤 category.uid?
我尝试传递属性名称,category.uid
但没有帮助。
如果方法在设计方面不正确,我很高兴得到评论家的看法。如果方法不止一种,可以详细说明利弊。
此外,我在 AWS 控制台上尝试了它,但它在那里也不起作用。我的表如下所示
检查类别字段,这是一个包含name
和的地图uid
。我尝试搜索类别名称,但没有出现任何结果。
AWS DynamoDB 是否甚至支持过滤嵌套属性。