Google Apps Engine – Write first Queries to get entity from datastore

Posted: October 7, 2011 in Google, Google App Engine

In this tutorial, i will show you the steps to write a query to get data from datastore of Google Apps Engine. In this case, i will get data from Person Entity. On your application you have save the Person entity like:

Google Apps Engine - Write first Queries to get entity from datastore

Person entity

And you will print on web the Person:

Salieri Antonio, 16 inches tall

Here is the step to do that:

1.  On your servlet, input these code

import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Query.FilterOperator;

........................

	// Get the Datastore Service
	DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
	
	// The Query interface assembles a query
	Query q = new Query("Person");
	q.addFilter("lastName", Query.FilterOperator.EQUAL, "Salieri");
	q.addFilter("height", FilterOperator.GREATER_THAN_OR_EQUAL, 16);
	
	// PreparedQuery contains the methods for fetching query results
	// from the datastore
	PreparedQuery pq =  datastore.prepare(q);

	for(Entity result: pq.asIterable()){
		
		String firstName = (String) result.getProperty("firstName");
		String lastName = (String) result.getProperty("lastName");
		Long height = (Long) result.getProperty("height");
		resp.getWriter().println(lastName + " " + firstName + ", " + height.toString() + " inches tall");
		
	}

 

In here, if you build and deploy on Google Apps Engine, you will get a Critical message like that:

Uncaught exception from servlet
com.google.appengine.api.datastore.DatastoreNeedIndexException: no matching index found.
The suggested index for this query is:
    <datastore-index kind="Person" ancestor="false" source="manual">
        <property name="lastName" direction="asc"/>
        <property name="height" direction="asc"/>
    </datastore-index>

	at com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:42)
	at com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:98)
................

To fix this issue you need to do the step two

2. Create datastore-indexes.xml file to make google known about the Query will execute on application

- Add the datastore-indexes.xml file at war/WEB-INF folder

Add the datastore-indexes.xml file at war/WEB-INF folder

Add the datastore-indexes.xml file at war/WEB-INF folder

- Add the these code

<?xml version="1.0" encoding="utf-8"?>
<datastore-indexes  autoGenerate="true">
    <datastore-index kind="Person" ancestor="false" source="manual">
        <property name="lastName" direction="asc"/>
        <property name="height" direction="asc"/>
    </datastore-index>
</datastore-indexes>

3. Build and Deploy

DONE  :)

About these ads
Comments
  1. Hello there, I discovered your website by the use of Google whilst
    searching for a comparable subject, your site came up, it
    looks great. I’ve bookmarked it in my google bookmarks.
    Hello there, just become aware of your blog via Google, and found that it’s really informative.

    I am gonna watch out for brussels. I’ll appreciate should you proceed this in future. A lot of other people can be benefited from your writing. Cheers!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s