Amazon dynamodb GSI的AWS DynamoDB映射器查询为所有非键属性返回null
我有一个映射到DynamoDB表的类,使用DynamoDbMapper查询它,我遇到了以下问题: 当我通过主散列键进行查询时,我会正确地返回所有值,但当我通过全局二级索引属性之一进行查询时,我仍然会返回对象,并且正确的记录始终存在,但填充的唯一字段是主散列键字段和GSI字段。当我通过GSI查询时,所有其他的都始终为空 这是我的班级:Amazon dynamodb GSI的AWS DynamoDB映射器查询为所有非键属性返回null,amazon-dynamodb,Amazon Dynamodb,我有一个映射到DynamoDB表的类,使用DynamoDbMapper查询它,我遇到了以下问题: 当我通过主散列键进行查询时,我会正确地返回所有值,但当我通过全局二级索引属性之一进行查询时,我仍然会返回对象,并且正确的记录始终存在,但填充的唯一字段是主散列键字段和GSI字段。当我通过GSI查询时,所有其他的都始终为空 这是我的班级: @DynamoDBTable(tableName="MyTableName") public class MyClass { private String
@DynamoDBTable(tableName="MyTableName")
public class MyClass {
private String id;
private String gsiField;
private String plainField;
@DynamoDBHashKey(attributeName="Id")
public String getId() { return id; }
public void setId(String id) { this.id = id; }
@DynamoDBIndexHashKey(attributeName="GsiField", globalSecondaryIndexName = "GsiFieldIndex")
public String getGsiField() {
return gsiField;
}
public void setGsiField(String gsiField) {
this.gsiField = gsiField;
}
@DynamoDBAttribute(attributeName = "PlainField")
public String getPlainField() {
return plainField;
}
public void setPlainField(String plainField) {
this.plainField = plainField;
}
}
以下是GsiField搜索的查询:
public List<MyClass> getListForGsiField(String gsiFieldValue){
List<MyClass> itemList = null;
try{
MyClass partitionKey = new MyClass();
partitionKey.setGsiField(gsiFieldValue);
DynamoDBQueryExpression<MyClass> queryExpression = new DynamoDBQueryExpression<>();
queryExpression.setHashKeyValues(partitionKey);
queryExpression.setIndexName("GsiFieldIndex");
queryExpression.setConsistentRead(false);
itemList = mapper.query(MyClass.class, queryExpression);
} catch (Exception e){
log.error(String.format("Exception querying datasource for gsiField %s", gsiFieldValue), e);
throw e;
}
return itemList;
}
无论DynamoDB中的plainfield值是多少,我的结果总是如下所示:
{
"Id": "123451234512345",
"GsiField": "<gsiFieldValue>",
"PlainField": null
}
{
"Id": "123451234512345",
"GsiField": "<gsiFieldValue>",
"PlainField": "<the_value_in_the_database>
}
而不是像这样:
{
"Id": "123451234512345",
"GsiField": "<gsiFieldValue>",
"PlainField": null
}
{
"Id": "123451234512345",
"GsiField": "<gsiFieldValue>",
"PlainField": "<the_value_in_the_database>
}
我担心我一定是执行了错误的查询,但它与我找到的所有成功示例都匹配,并返回了正确的记录作为结果。我猜GSI是使用ProjectionType作为键创建的 1使用下面的AWS CLI descripe命令检查表的定义,特别是GSI定义
aws dynamodb describe-table --table-name MyTableName
2检查GSI上的投影是否仅定义为键_
如果将其定义为“仅关键点”,则GSI仅具有关键点属性。您可能需要查询主表以获取其他属性,或者需要重新创建GSI以投影所有属性。这正是问题所在,谢谢!当我切换到ProjectionType:ALL的索引时,我让它按我预期的那样工作。非常感谢。因为我不能问这个问题:我正在使用DynamoDB mapper和@DynamoDBIndexHashKey创建一个实体,我在其中指定了globalSecondaryIndexName,但我找不到如何指定ProjectionType,所以我可以使用任何注释吗?如果不是,我该如何处理?谢谢@概念探索