2012-05-29 13 views
8

Estoy tratando de consultar DynamoDB con la ayuda de DynamoDBMapper en Java con hashKey y rangeKey. Pero no obtengo todos los resultados, solo devuelve una parte. Mi código es el siguiente:¿Cómo puedo recuperar todos los elementos del resultado paginado de una consulta de DynamoDBMapper()?

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; 
} 

MyObj está anotado correctamente con anotaciones DynamoDB. Así que puedo guardar los objetos, pero la recuperación solo arroja un resultado parcial.

La documentación de consulta dentro DynamoDBMapper dice:

El método de consulta devuelve la colección "-perezoso cargado". Es decir, inicialmente devuelve solo una página de resultados. Hace una llamada de servicio para la siguiente página cuando sea necesario.

Ahora la pregunta es, ¿cómo decirle al mapeador que haga una llamada de servicio o que se necesita una página, por lo que carga todas las páginas (de hecho todas las entradas)?

Respuesta

9

El fragmento de código Java dentro de la documentación Amazon DynamoDB para la DynamoDBMapper Class es un poco desafortunado aquí (aunque tecnológicamente correcta), la documentación AWS SDK for Java API para Class DynamoDBMapper es (naturalmente) más precisa en este sentido, véase método query():

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

Así que el tipo devuelto es en realidad un Class PaginatedQueryList: Implementación

de la interfaz de lista que representa los resultados de vaivén m una consulta en AWS DynamoDB. Los resultados paginados se cargan bajo demanda cuando el usuario ejecuta una operación que los requiere. Algunas operaciones, , como tamaño(), deben recuperar toda la lista, pero los resultados son vagamente obtenidos página por página cuando es posible. [énfasis en la mina]

Es decir, que realmente no es necesario cargar explícitamente nada durante el uso normal, en la medida en que se toma implícitamente cargo de la implementación perezoso de carga de PaginatedQueryList<T>; sin embargo, si así lo desea por cualquier razón, puede desencadenarlo mediante operaciones que requieren acceso a toda la colección, con el método explícitamente mencionado como size() que es uno de ellos aparentemente.

+0

Abierto, estoy de acuerdo con su respuesta, Parece que estoy en el mismo problema. La pregunta está aquí, https://stackoverflow.com/questions/45495145/issue-with-caching-and-dynamo-db-combination – Deepak

Cuestiones relacionadas