Amazon dynamodb GSI的AWS DynamoDB映射器查询为所有非键属性返回null

Amazon dynamodb GSI的AWS DynamoDB映射器查询为所有非键属性返回null,amazon-dynamodb,Amazon Dynamodb,我有一个映射到DynamoDB表的类,使用DynamoDbMapper查询它,我遇到了以下问题: 当我通过主散列键进行查询时,我会正确地返回所有值,但当我通过全局二级索引属性之一进行查询时,我仍然会返回对象,并且正确的记录始终存在,但填充的唯一字段是主散列键字段和GSI字段。当我通过GSI查询时,所有其他的都始终为空 这是我的班级: @DynamoDBTable(tableName="MyTableName") public class MyClass { private String

我有一个映射到DynamoDB表的类,使用DynamoDbMapper查询它,我遇到了以下问题:

当我通过主散列键进行查询时,我会正确地返回所有值,但当我通过全局二级索引属性之一进行查询时,我仍然会返回对象,并且正确的记录始终存在,但填充的唯一字段是主散列键字段和GSI字段。当我通过GSI查询时,所有其他的都始终为空

这是我的班级:

@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,所以我可以使用任何注释吗?如果不是,我该如何处理?谢谢@概念探索