Java 错误属性名称是保留关键字

Java 错误属性名称是保留关键字,java,amazon-dynamodb,Java,Amazon Dynamodb,我的dynamoDb里有数据 我的数据库使用priceId作为PrimaryKey,符号作为sortKey和其他is属性 我试着使用这个代码 Table table = dynamoDB.getTable(tableName); System.out.println("runFirstTime For Search Data"); String Symbols = "EURUSD"; String time = "2020-06-10 06:08:

我的dynamoDb里有数据

我的数据库使用priceId作为PrimaryKey,符号作为sortKey和其他is属性

我试着使用这个代码

Table table = dynamoDB.getTable(tableName);
        System.out.println("runFirstTime For Search Data");
        String Symbols = "EURUSD";
        String time = "2020-06-10 06:08:07";
        try{
            Item item = table.getItem("symbol", Symbols, "Time", time, "symbol, Price, Time", null);
            System.out.println("Displaying retrieved items...");
            String price = item.getString("Price");
            System.out.println(price);
            System.out.println(item.toJSONPretty());
        }catch (Exception e) {
             System.err.println("Cannot retrieve items.");
             System.err.println(e.getMessage());
          }
但我犯了一个错误,比如

Invalid ProjectionExpression: Attribute name is a reserved keyword; reserved keyword: Time (Service: AmazonDynamoDBv2; Status Code: 400; Error Code: ValidationException; Request ID: 5QP69C4BA99JP3LKTKIL8NHB7RVV4KQNSO5AEMVJF66Q9ASUAAJG; Proxy: null)
我已将我的数据库结构更新为,符号为primaryKey,priceId为sortKey,其他为属性:

当我使用这个代码时

Table table = dynamoDB.getTable(tableName);
        System.out.println("runFirstTime For Search Data");
        String Symbols = "EURUSD";
        String time = "2020-06-10 09:12:07";
        try{
            //GetItemSpec spec = new GetItemSpec().withPrimaryKey("symbol", Symbols).
            Item item = table.getItem("symbol", Symbols, "savetime", time, "symbol, Price, savetime", null);
            System.out.println("Displaying retrieved items...");
            String price = item.getString("Price");
            System.out.println(price);
            System.out.println(item.toJSONPretty());
        }catch (Exception e) {
             System.err.println("Cannot retrieve items.");
             System.err.println(e.getMessage());
          }
我得到一个错误,如:提供的键元素与模式服务不匹配:AmazonDynamoDBv2;身份代码:400;错误代码:ValidationException;请求ID:KFCMB4GVB2QC7PAQD6AN5CE5HRVV4KQNSO5AEMVJF66Q9ASUAJG;代理:null

我的问题是: 1.为什么会有这样的错误? 2.如果我想得到所有的价格,如何使用一个名为symbol的primaryKey和名为savetime的属性编码或设置我的数据库? 3.如何从dynamoDb检索数据

如果已将保留字时间用作属性名称,请尝试为此属性定义其他名称。 您可以在此处看到保留名称列表:

要获取所有价格,可以使用扫描和在ProjectionExpression中设置价格。
查看此处的java文档:

关于Q1:您应该使用ExpressionAttributeNames,这是防止名称与保留关键字冲突的正确工具

我不知道Java API,所以这里只使用命令行工具和localstack:

awslocal dynamodb query --table-name YourTableName --index-name yourIndexName \
    --key-condition-expression '#time= :time' \
    --expression-attribute-values '{":time":{"S":"2015-02-18T20:27:36.165Z"}}' \
    --expression-attribute-names  '{"#time":"time"}' \
    --return-consumed-capacity TOTAL

尽管这个答案可能并不完美,但它肯定会为您提供足够的指导,告诉您如何在不迁移数据库的情况下解决Q1

好的,第一个问题完成了,但是第二个问题还没有完成。伊万·斯库迪亚先生有什么例子吗?