Closed
Description
My project has a structure similar to below. How do I query by InnerClassPrimaryKey? Tried to use filterExpression but that is not working.
AWS Java SDK version used: AWS SDK 2.16.99
JDK version used: Open JDK 11
Operating System and version: Windows 10
@DynamoDbBean
public class OuterClass {
private String outerClassPrimaryKey;
private List<InnerClass> innerClassList;
@DynamoDbPartitionKey
public String getOuterClassPrimaryKey() { return outerClassPrimaryKey; }
public void setOuterClassPrimaryKey(String outerClassPrimaryKey) { this.outerClassPrimaryKey = outerClassPrimaryKey; }
public List<InnerClass> getInnerClassList() { return innerClassList; }
public void setInnerClassList(List<InnerClass> innerClassList) { this.innerClassList = innerClassList; }
}
@DynamoDbBean
public class InnerClass {
private String innerClassPrimaryKey;
private String innerClassAttribute1;
private String innerClassAttribute2;
@DynamoDbPartitionKey
public String getInnerClassPrimaryKey() { return innerClassPrimaryKey; }
public void setInnerClassPrimaryKey(String innerClassPrimaryKey) { this.innerClassPrimaryKey = innerClassPrimaryKey; }
public String getInnerClassAttribute1() { return innerClassAttribute1; }
public void setInnerClassAttribute1(String innerClassAttribute1) { this.innerClassAttribute1 = innerClassAttribute1; }
public String getInnerClassAttribute2() { return innerClassAttribute2; }
public void setInnerClassAttribute2(String innerClassAttribute2) { this.innerClassAttribute2 = innerClassAttribute2; }
}
public class InnerOuterDynamoDbService {
private DynamoDbClient ddb;
private DynamoDbEnhancedClient eddb;
private TableSchema<OuterClass> outerClassSchema;
private DynamoDbTable<OuterClass> outerClassTable;
public InnerOuterDynamoDbService(DynamoDbClient ddb) {
this.ddb = ddb;
this.eddb = DynamoDbEnhancedClient.builder().dynamoDbClient(ddb).build();
this.outerClassSchema = TableSchema.fromClass(OuterClass.class);
this.outerClassTable = eddb.table(OuterClass.class.getSimpleName(), outerClassSchema);
}
public OuterClass getOuterClass(String key) {
return outerClassTable.getItem(Key.builder().partitionValue(key).build());
}
public OuterClass getOuterClassByInnerPk(String outerClassPrimaryKey, String innerClassPrimaryKey) {
AttributeValue attribute = AttributeValue.builder().s(innerClassPrimaryKey).build();
Expression expression = Expression.builder().expression("innerClassPrimaryKey = :value")
.putExpressionValue(":value", attribute).build();
Key partitionKey = Key.builder().partitionValue(outerClassPrimaryKey).build();
QueryConditional queryConditional = QueryConditional.keyEqualTo(partitionKey);
PageIterable<OuterClass> results = outerClassTable.query(
QueryEnhancedRequest.builder().queryConditional(queryConditional).filterExpression(expression).build());
return results.items().stream().collect(Collectors.toList()).get(0);
}
public void putOuterClass(OuterClass item) { outerClassTable.putItem(item); }
public void createOuterTable() {
outerClassTable.createTable();
outerClassTable.tableSchema().tableMetadata().toString();
}
}