使用低级java API

时间:2015-11-06 00:18:37

标签: java amazon-dynamodb aws-sdk

我正在尝试使用哈希键查询本地二级索引。

我的表:表1 用户名(hash_key),Id(range_key),时间戳....

我的本​​地二级索引(因为我想查询所有用户名并按时间排序) 我的LSI:Table1_TimestampLSI 用户名(hash_key),时间戳(range_key)

e.g user1 | 123 | 2015年12月12日 user1 | 456 | 2015年11月1日 user2 | 789 | 2015年12月1日

注意:我不能只在表格中设置范围键的时间戳,因为(用户名+时间戳)不是唯一的。所以我必须创建一个ID字段以确保唯一性。

因为我想要异步客户端,所以我使用的是低级API(模型NOT文档)java API。

查询索引的功能

HashMap<String, Condition> queryFilter = new HashMap<String, Condition>();
        Condition condition = new Condition()
                .withComparisonOperator(ComparisonOperator.EQ.toString())
                .withAttributeValueList(new AttributeValue().withS(username));
        queryFilter.put("Username", condition);

        QueryRequest queryRequest = new QueryRequest(tableName + "_TimestampLSI").withQueryFilter(queryFilter);

        queryRequest.setScanIndexForward(false);

        Future<QueryResult> fQueryResult = dynamoDB.queryAsync(queryRequest,
            new AsyncHandler<QueryRequest,QueryResult>() {
                public void onSuccess(QueryRequest request, QueryResult result) {
                    System.out.println("Table: " + result);
                }

                public void onError(Exception exception) {
                    System.out.println("Error describing table: " + exception.getMessage());
                    // Callers can also test if exception is an instance of 
                    // AmazonServiceException or AmazonClientException and cast 
                    // it to get additional information
                }             
            });

        System.out.println("Result: " + fQueryResult);

我收到以下错误 描述表时出错:必须在请求中指定KeyConditions或KeyConditionExpression参数。 (服务:AmazonDynamoDBv2;状态代码:400;错误代码:ValidationException;

我错过了什么吗?以为我应该只能在哈希值上查询索引。

1 个答案:

答案 0 :(得分:0)

您误解了地方指数。

Query始终采用哈希键。因此,QueryRequest应该设置setHashKeyValue

您不能对查询进行交叉哈希,而不能使用哈希+范围主键而不能使用LSI。你可以用GSI做到这一点,但我不确定这对你有什么帮助。

目前尚不清楚你究竟想要达到的目标。如果您想要所有用户名,那么您需要Scan而不是查询 - 因为您希望所有哈希键都存在。