私はそれを照会するDynamoDbMapperを使用して、DynamoDBのテーブルにマップされたクラスを持って、そして次の問題が生じていますのためにnullを返しますハッシュキー、私はすべての値を正しく取得しますが、グローバルセカンダリインデックス属性のいずれかでクエリを実行しても、オブジェクトは戻ってきますが、正しいレコードは常に存在しますが、キーフィールド、およびGSIフィールドが含まれます。私がGSIで照会すると、他のものは常にヌルです。ここでAWS DynamoDBのマッパーのクエリは、すべての非キー属性
が私のクラスである:
@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の中プレーンフィールドの値の、私の結果は、常にこのようになります。代わりに、このようなの
{
"Id": "123451234512345",
"GsiField": "<gsiFieldValue>",
"PlainField": null
}
:
{
"Id": "123451234512345",
"GsiField": "<gsiFieldValue>",
"PlainField": "<the_value_in_the_database>
}
私はクエリを間違って実行する必要がありますが、見つかったすべての成功例と一致し、結果として正しいレコードを返します。
これはまさに問題でした。ありがとうございました! 「ProjectionType」のインデックスに切り替えると、「ALL」と表示され、期待どおりに動作するようになりました。ありがとうございました! – codeblue0000ff