使用多个字段动态扫描DynamoDB集合



我正在使用Springboot和DynamoDB作为数据库创建REST服务。我有一个带有以下字段和主题类的StudentDTO课程,其中主题信息为(键,值对(:

@DynamoDBTable(tableName="Students")
Class Students{
@DynamoDBHashKey(attributeName="id")
int id;
String name;
int year;
@DynamoDBAttribute(attributeName="subjects")
List<Subjects> subjects; //it has serializedName("subjects")
//getter and setters 
}
@DynamoDBDocument
Class Subjects{
String key;
String value;
}

我有一些标准,需要获取数据。这些标准可能会有所不同。以下是一个例子:

  1. 可以在名称上获取数据,ID(" ID":1,"名称":" Joe"(
  2. 可以获取名称,主题信息("名称":" joe",主题:" [{" key":" s1"," value":"地理"},{" key":" s2"(," value":"历史"}]"(
  3. 可能想要名称的数据,年

没有标准的固定组合,我可以在上面构建查询。我尝试使用DynamoDbscanexpression,但无法识别如何设置过滤器表达。

创建了一张(键,值(的地图(例如((

我可以创建attributeName和attributeValue(your in dynamodbdao.java(:

 Map<String, String> attributeNames = new HashMap<String, String>();
    Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>();
 StringJoiner filterExpression = new StringJoiner(" AND ");
    if (null != json.getS_no()) {
        StringBuilder expression = new StringBuilder();
        attributeNames.put("#s_no", "s_no");
        attributeValues.put(":sno", new AttributeValue().withN(json.getS_no()));
        expression.append("#s_no").append(" ").append("<>").append(" ").append(":s_no");
        filterExpression.add(expression);
    }
    if (null != json.getName()) {
        StringBuilder expression = new StringBuilder();
        attributeNames.put("#name", "name");
        attributeValues.put(":name", new AttributeValue().withN(json.getName()));
        expression.append("#name").append(" ").append("<>").append(" ").append(":name");
        filterExpression.add(expression);
    }
    if(null != json.getSubjects()){
        StringBuilder expression = new StringBuilder();
        attributeNames.put("#subjects", "subjects");
        attributeValues.put(":subjects", new AttributeValue().withS(map.keySet().toString()));
        expression.append("#subjects").append(" ").append("IN").append(" ").append(":subjects");
    }
    ...
    and so on

扫描查询

  DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
        .withFilterExpression(filterExpression.toString()) // HERE CONDITION CAN CHANGE ACCORDING TO THE ATTRIBUTES IN THE INPUT.
        .withExpressionAttributeNames(attributeNames)
        .withExpressionAttributeValues(attributeValues);
  List<DBMapper> records = Dynamomapper.scan(DBMapper.class, scanExpression);

但是在scan((函数中,给出了例外:

 com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException:Students[subjects]; could not unconvert subjects
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperTableModel.unconvert(DynamoDBMapperTableModel.java:271)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.privateMarshallIntoObject(DynamoDBMapper.java:456)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.marshallIntoObjects(DynamoDBMapper.java:484)
at com.amazonaws.services.dynamodbv2.datamodeling.PaginatedScanList.<init>(PaginatedScanList.java:64)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.scan(DynamoDBMapper.java:1458)
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.scan(AbstractDynamoDBMapper.java:216)
at com.example.dynamodb.dao.DynamoDBDAO.findByAttributes(DynamoDBDAO.java:379)

请建议。

看来您在主题类中的属性上缺少@dynamodbattribute。

将主题类更改为以下内容,应允许其正确化:

@DynamoDBDocument
class Subjects {
    @DynamoDBAttribute(attributeName="key")
    String key;
    @DynamoDBAttribute(attributeName="value")
    String value;
    // Getters/setters
}

另外,如果您打算获取名称和年份属性,您可能还需要将@dynamodbattribute添加到学生课程中的名称和年度字段中。

我得到的解决方案是通过在此pojo

中添加不参数参数

最新更新