10

Java でDynamoDBMapperを使用して、hashKey と rangeKey の両方を使用して DynamoDB にクエリを実行しようとしています。しかし、私はすべての結果を取得しているわけではなく、その一部のみを返します。私のコードは次のようになります:

queryDynamoDb() {
  Condition rangeKeyCondition = new Condition()
    .withComparisonOperator(ComparisonOperator.GT.toString())
    .withAttributeValueList(new AttributeValue().withS("0"));

    DynamoDBQueryExpression queryExpression = new DynamoDBQueryExpression(
            new AttributeValue().withS(prefKey));

    queryExpression.setRangeKeyCondition(rangeKeyCondition);

    List<MyObj> myobjs = mapper.query(MyObj.class, queryExpression);
    return myobjs;
}

MyObjDynamoDB アノテーションで適切にアノテーションが付けられます。したがって、オブジェクトを保存することはできますが、検索では部分的な結果しか返されません。

DynamoDBMapper内のクエリのドキュメントには、次のように記載されています。

query メソッドは、「遅延読み込み」コレクションを返します。つまり、最初は 1 ページの結果のみが返されます。必要に応じて次ページのサービスコールを行います。

問題は、マッパーにサービス呼び出しを行うように、またはページが必要であることを伝える方法です。そのため、すべてのページ (実質的にすべてのエントリ) をロードします。

4

1 に答える 1

11

DynamoDBMapperクラスのAmazonDynamoDBドキュメント内のJavaコードスニペットはここでは少し残念です(技術的には正しいですが)。クラスDynamoDBMapperのAWS SDK for Java APIドキュメントは、この点で(当然のことながら)より正確です。メソッドquery()を参照してください。

public <T> PaginatedQueryList<T> query(Class<T> clazz,
                                       DynamoDBQueryExpression queryExpression)

したがって、返される型は実際にはクラスPaginatedQueryListです。

AWSDynamoDBのクエリの結果を表すListインターフェースの実装。ページ化された結果は、ユーザーがそれらを必要とする操作を実行すると、オンデマンドでロードされます。size()などの一部の操作では、リスト全体をフェッチする必要がありますが、可能な場合、結果はページごとに遅延フェッチされます。[私のものを強調する]

PaginatedQueryList<T>つまり、 ;の遅延読み込みの実装によって暗黙的に処理される限り、通常の使用中に明示的に何かを読み込む必要はありません。ただし、何らかの理由で必要な場合は、コレクション全体へのアクセスを必要とする操作によってトリガーできます。明示的に言及されているsize()メソッドは明らかにその1つです。

于 2012-05-29T21:19:53.070 に答える