JDO provides persistence of objects. The logical next step after persisting objects is to retrieve them for use in your application. There are several ways to do this
The simplest form of object retrieval is where we have the identity. This is simply
Object obj = pm.getObjectById(identity);
If the object is in the JDO cache then it is retrieved from there, otherwise the JDO implementation goes to the datastore. When the object is retrieved its fields are populated according to its Fetch Group.
A persistable class can be persisted with an Extent of all instances of that type. You can use this to retrieve objects of the required type, like this
Extent ex = pm.getExtent(MyClass.class, true); Iterator iter = ex.iterator(); while (iter.hasNext()) { MyClass obj = (MyClass)iter.next(); ... }
The second argument in the getExtent call is whether to include instances of subclasses.
Where we want to retrieve all objects based on some criteria (e.g all objects of class A where field 'x' of A is a certain value) we need to use a query language. JDO2 provides 2 options here. JDOQL is object-based and allows you to express your query in terms of the classes and fields you are using. SQL is datastore-based and allows you to express your query in terms of the datastore tables and columns.
To give an example of a JDOQL query
Query q = pm.newQuery(MyClass.class, "field1 < value"); q.declareParameters("int value"); List results = q.execute(205); Iterator iter = results.iterator(); while (iter.hasNext()) { MyClass obj = (MyClass)iter.next(); }
If the objects found by the query are in the JDO cache then they are retrieved from there, otherwise the JDO implementation goes to the datastore. When the objects are retrieved their fields are populated according to the Fetch Group.