## Query item
Now that you were able to make a mutation, take the `Id` that was printed out and use it in your query to retrieve data.
```java
private void getTodo(String id) {
Amplify.API.query(
ModelQuery.get(Todo.class, id),
response -> Log.i("MyAmplifyApp", ((Todo) response.getData()).getName()),
error -> Log.e("MyAmplifyApp", error.toString(), error)
);
}
```
```kotlin
private fun getTodo(id: String) {
Amplify.API.query(ModelQuery.get(Todo::class.java, id),
{ Log.i("MyAmplifyApp", "Query results = ${(it.data as Todo).name}") },
{ Log.e("MyAmplifyApp", "Query failed", it) }
);
}
```
```kotlin
suspend fun getTodo(id: String) {
try {
val response = Amplify.API.query(ModelQuery.get(Todo::class.java, id))
Log.i("MyAmplifyApp", response.data.name)
} catch (error: ApiException) {
Log.e("MyAmplifyApp", "Query failed", error)
}
}
```
```java
private void getTodo(String id) {
RxAmplify.API.query(ModelQuery.get(Todo.class, id))
.subscribe(
response -> Log.i("MyAmplifyApp", ((Todo) response.getData()).getName()),
error -> Log.e("MyAmplifyApp", error.toString(), error)
);
}
```
## List items
You can get the list of items that match a condition that you specify in `Amplify.API.query`:
```java
Amplify.API.query(
ModelQuery.list(Todo.class, Todo.NAME.contains("first")),
response -> {
for (Todo todo : response.getData()) {
Log.i("MyAmplifyApp", todo.getName());
}
},
error -> Log.e("MyAmplifyApp", "Query failure", error)
);
```
```kotlin
Amplify.API.query(
ModelQuery.list(Todo::class.java, Todo.NAME.contains("first")),
{ response ->
response.data.forEach { todo ->
Log.i("MyAmplifyApp", todo.name)
}
},
{ Log.e("MyAmplifyApp", "Query failure", it) }
)
```
```kotlin
try {
Amplify.API
.query(ModelQuery.list(Todo::class.java, Todo.NAME.contains("first")))
.response.data
.items.forEach { todo -> Log.i("MyAmplifyApp", todo.name) }
} catch (error: ApiException) {
Log.e("MyAmplifyApp", "Query failure", error)
}
```
```java
RxAmplify.API.query(ModelQuery.list(Todo.class, Todo.NAME.contains("first"))
.subscribe(
response -> {
for (Todo todo : response.getData()) {
Log.i("MyAmplifyApp", todo.getName());
}
},
error -> Log.e("MyAmplifyApp", "Query failure", error)
);
```
> **Note**: This approach will only return up to the first 1,000 items. To change this limit or make requests for additional results beyond this limit, use *pagination* as discussed below.
## List subsequent pages of items
A list query only returns the first 1,000 items by default, so for large data sets, you'll need to paginate through the results. After receiving a page of results, you can obtain a `GraphQLRequest` for requesting the next page, if there are more results available. The page size is configurable as well, as in the example below.
```java
public void queryFirstPage() {
query(ModelQuery.list(Todo.class, ModelPagination.limit(1_000)));
}
private static void query(GraphQLRequest> request) {
Amplify.API.query(
request,
response -> {
if (response.hasData()) {
for (Todo todo : response.getData()) {
Log.d("MyAmplifyApp", todo.getName());
}
if (response.getData().hasNextResult()) {
query(response.getData().getRequestForNextResult());
}
}
},
failure -> Log.e("MyAmplifyApp", "Query failed.", failure)
);
}
```
```kotlin
fun queryFirstPage() {
query(ModelQuery.list(Todo::class.java, ModelPagination.limit(1_000)))
}
fun query(request: GraphQLRequest>) {
Amplify.API.query(request,
{ response ->
if (response.hasData()) {
response.data.items.forEach { todo ->
Log.d("MyAmplifyApp", todo.name)
}
if (response.data.hasNextResult()) {
query(response.data.requestForNextResult)
}
}
},
{ Log.e("MyAmplifyApp", "Query failed", it) }
)
}
```
```kotlin
suspend fun queryFirstPage() {
query(ModelQuery.list(Todo::class.java,
ModelPagination.firstPage().withLimit(1_000)))
}
suspend fun query(request: GraphQLRequest>) {
try {
val response = Amplify.API.query(request)
response.data.items.forEach { todo ->
Log.d("MyAmplifyApp", todo.name)
}
if (response.data.hasNextResult()) {
query(response.data.requestForNextResult)
}
} catch (error: ApiException) {
Log.e("MyAmplifyApp", "Query failed.", error)
}
}
```
```java
BehaviorSubject>> subject =
BehaviorSubject.createDefault(ModelQuery.list(Todo.class, ModelPagination.limit(1_000)));
subject.concatMap(request -> RxAmplify.API.query(request).toObservable())
.doOnNext(response -> {
if (response.hasErrors()) {
subject.onError(new Exception(String.format("Query failed: %s", response.getErrors())));
} else if (!response.hasData()) {
subject.onError(new Exception("Empty response from AppSync."));
} else if(response.getData().hasNextResult()) {
subject.onNext(response.getData().getRequestForNextResult());
} else {
subject.onComplete();
}
})
.concatMapIterable(GraphQLResponse::getData)
.subscribe(
todo -> Log.d(TAG, "Todo: " + todo),
error -> Log.e(TAG, "Error: " + error)
);
```