在查询中找不到散列键条件

时间:2015-10-09 06:11:32

标签: android amazon-web-services amazon-dynamodb aws-sdk

我正在使用 AWS DynamoDB服务。 我创建了一个表“Parkurself”作为哈希键,没有范围键,“Latitude”,“Longitude”作为两个属性。而且我在桌子上有一个项目,(“parkurself”,30,30)为(Parkurself,Longitude,Latitude)。 当我使用 Android SDK 查询数据库时,我使用了以下程序。

DynamoDBQueryExpression queryExpression=new DynamoDBQueryExpression()
            .withHashKeyValues("parkurself")
            .withFilterExpression("Latitude>25")
            .withFilterExpression("Latitude<40")
            .withFilterExpression("Longitude>25")
            .withFilterExpression("Longitude<40")
            .withConsistentRead(false);
PaginatedQueryList<ParkingInfo> result=mapper.query(ParkingInfo.class, queryExpression);

但是,我收到错误“在查询中找不到哈希键条件” Logcat正在附加。

Caused by: java.lang.IllegalArgumentException: Illegal query expression: No hash key condition is found in the query
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.processKeyConditions(DynamoDBMapper.java:2420)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.createQueryRequestFromExpression(DynamoDBMapper.java:2382)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.query(DynamoDBMapper.java:2166)
        at com.amazonaws.mobileconnectors.dynamodbv2.dynamodbmapper.DynamoDBMapper.query(DynamoDBMapper.java:2127)
        at monster.com.parkurself.QueryParkingInfo.doInBackground(QueryParkingInfo.java:63)
        at monster.com.parkurself.QueryParkingInfo.doInBackground(QueryParkingInfo.java:18)
        at android.os.AsyncTask$2.call(AsyncTask.java:295)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

我不知道如何修复它。 谁能给我一些帮助? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

你没有通过dynamo db mapper(http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.htmlhttp://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaSDKHighLevel.html) 为了使用DynamoDBQueryExpression,您必须通过映射器。 你传入withHashKeyValues的内容需要是一个从具有正确注释的类实例化的对象。见这里的例子:

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html

您需要创建一个以Parkurself,Longitude,Latitude为成员的类,并通过属性正确标记它们。

有关如何访问DDB的更多信息,请访问: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/AboutJava.html

如果您不想/需要使用映射器(即高级API),您可以通过低级api。

答案 1 :(得分:1)

正如Mircea所说,你需要创建一个类,它首先封装了你已经完成的条目。这里的问题是你已经传递了没有映射属性的String类。

创建mapper类的实例,并将哈希键设置为您要查询的哈希键。将该类传递给查询,它应该可以工作。

// Create object which maps to the query object.
ParkingInfo parkingInfo = new ParkingInfo();
parkingInfo.setID("parkurself");

DynamoDBQueryExpression<ParkingInfo> queryExpression = new DynamoDBQueryExpression<ParkingInfo>()
        .withHashKeyValues(parkingInfo)
        .withFilterExpression("Latitude>25")
        .withFilterExpression("Latitude<40")
        .withFilterExpression("Longitude>25")
        .withFilterExpression("Longitude<40")
        .withConsistentRead(false);

PaginatedQueryList<ParkingInfo> result = mapper.query(ParkingInfo.class, queryExpression);