Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在dynamo中,如何通过搜索hash_键来显示项目列表?_Java_Amazon Dynamodb - Fatal编程技术网

Java 在dynamo中,如何通过搜索hash_键来显示项目列表?

Java 在dynamo中,如何通过搜索hash_键来显示项目列表?,java,amazon-dynamodb,Java,Amazon Dynamodb,我在dynamo中有一个表,它有一个哈希键:Name(String)和另外3个全局索引。 例如,我需要搜索并将我的Name==myNameToSearch所在的项目列表带入搜索。 但我在使用getItem获取时遇到问题。我在迪纳摩有一些东西。 我面临着这个错误: The provided key element does not match the schema (Service: DynamoDb, Status Code: 400 但我的哈希键是正确的 这里是我的班级发电机配置: @Get

我在dynamo中有一个表,它有一个哈希键:
Name
String
)和另外3个全局索引。 例如,我需要搜索并将我的
Name
==
myNameToSearch
所在的项目列表带入搜索。 但我在使用getItem获取时遇到问题。我在迪纳摩有一些东西。 我面临着这个错误:

The provided key element does not match the schema (Service: DynamoDb, Status Code: 400
但我的哈希键是正确的

这里是我的班级发电机配置:

@Getter
@Singleton
@Slf4j
public class DynamoDBConfig {
    private DynamoDbTable<MyModel> table;

    public DynamoDBConfig(Config config) {
        DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(DynamoDbClient.builder().build())
                .build();

        String tableName = config.getValue("myDynamoTable");
        table = enhancedClient.table(tableName, TableSchema.fromBean(MyModel.class));
    }
}
我的模型:

@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@DynamoDbBean
@EqualsAndHashCode
public class MyModel implements Serializable {

public static final String MYNAME = "Name";
public static final String ANOTHER_FIELD_GLOBAL_INDEX = "anotherField";

    @JsonProperty(MYNAME)
    @Getter(onMethod_ = {@DynamoDbAttribute(MYNAME), @DynamoDbPartitionKey})
    private String myName;

    @JsonProperty(ANOTHER_FIELD_GLOBAL_INDEX)
    @Getter(onMethod_ = {@DynamoDbAttribute(ANOTHER_FIELD_GLOBAL_INDEX)})
    private LocalDate anotherField;

}

您可能误解了DynamoDB中主键的工作原理

听起来你有一个复合主键,这意味着你有一个分区键和一个排序键。
getItem
操作的工作原理是通过完整的主键(分区键和排序键)获取项目。您不能单独使用getItem通过排序键进行获取,这正是DynamoDB错误告诉您的

The provided key element does not match the schema
如果您想单独使用排序键的值进行提取,您有几个选项

  • 使用
    scan
    查找感兴趣的项目。这并不理想,但如果您无法更改数据模型,这是一个选项
  • 创建一个全局二级索引(GSI),用于交换分区键和排序键值。这种模式称为反向索引。这将允许您使用给定的用户名标识所有项目

  • 我无法扫描基地,因为它将有数百万个项目。有一个辅助全局索引,我可以不使用分区键进行搜索吗?您提到您有一个哈希键
    name
    ,但我在您的代码中没有看到。你的桌子看起来像什么?该错误可能是DDB用作主键的内容与您提供给getItem操作的值不匹配。我编辑了代码
    The provided key element does not match the schema