JDOQL is a data store-neutral query language based on Java boolean expressions. The syntax of JDOQL is the same as standard Java syntax, with the following exceptions:
Equality and ordering comparisons between primitives and instances of wrapper classes (Boolean, Byte, Integer, etc) are valid.
Equality and ordering between Dates are valid.
The assignment operators (=, +=, *=, etc) and ++ and -- operators are not supported.
Methods are not supported, with the following exceptions:
Collection.contains
Collection.isEmpty
String.startsWith
String.endsWith
Traversing a null-valued field, which would normally throw a NullPointerException, instead causes the subexpression to evaluate to false for the current candidate.
The following literal types are supported: character literals, integer literals, floating point literals, boolean literals, string literals, and the null literal.
![]() | Note |
|---|---|
Kodo JDO also supports the Map.containsKey and Map.containsValue methods. | |
We will now present several examples illustrating the features of JDOQL and the Query interface. The examples use the following persistence-capable classes:
package org.mag;
public class Magazine
{
private String title;
private double price;
private int copiesSold;
private Company publisher;
private Article coverArticle;
private Set articles;
...
}
public class Article
{
private String title;
private Collection subTitles;
...
}
package org.mag.pub;
public class Company
{
private String name;
private double revenue;
...
}
Example 11.1. Basic Query
Find all magazines whose price is greater than 3 dollars:
Extent mags = pm.getExtent (Magazine.class, false); String filter = "price > 10.0"; Query query = pm.newQuery (mags, filter); Collection results = (Collection) query.execute ();
Example 11.2. Result Ordering and Method Calls
Find all magazines whose title starts with "The ", in ascending order by price:
Extent mags = pm.getExtent (Magazine.class, false);
String filter = "title.startsWith (\"The \")";
Query query = pm.newQuery (mags, filter);
query.setOrdering ("price ascending");
Collection results = (Collection) query.execute ();
Example 11.3. Mathematical Operations and Relation Traversal
Find all magazines whose revenue is over 1% of the total revenue for the publisher, in descending order by publisher revenue and ascending order by publisher name:
Extent mags = pm.getExtent (Magazine.class, false);
String filter = "price * copiesSold > publisher.revenue * .01";
Query query = pm.newQuery (mags, filter);
query.setOrdering ("publisher.revenue descending, publisher.name ascending");
Collection results = (Collection) query.execute ();
Example 11.4. Precedence and Logical Operators
Find all magazines published by Random House or Addison Wesley whose price is less than or equal to 3 dollars:
Extent mags = pm.getExtent (Magazine.class, false);
String filter = "price <= 10.0 "
+ "&& (publisher.name == \"Random House\" "
+ "|| publisher.name == \"Addison Wesley\")";
Query query = pm.newQuery (mags, filter);
Collection results = (Collection) query.execute ();
Example 11.5. Imports and Parameters
Find all magazines published by a given company whose price is greater than a given number:
Company myCompany = ...;
Double myPrice = ...;
Extent mags = pm.getExtent (Magazine.class, false);
String filter = "publisher == pub && price > amnt";
Query query = pm.newQuery (mags, filter);
query.declareImports ("import org.mag.pub.*;");
query.declareParameters ("Company pub, Double amnt");
Collection results = (Collection) query.execute (myCompany, myPrice);
Example 11.6. Collections
Find all magazines whose cover article has a subtitle of "The Real Story" or whose cover article has no subtitles:
Extent mags = pm.getExtent (Magazine.class, false);
String filter = "coverArticle.subTitles.contains (\"The Real Story\") "
+ "|| coverArticle.subTitles.isEmpty ()";
Query query = pm.newQuery (mags, filter);
Collection results = (Collection) query.execute ();
Example 11.7. Variables
Find all magazines that have an article titled "Fourier Transforms":
Extent mags = pm.getExtent (Magazine.class, false);
String filter = "articles.contains (art)
&& art.title == \"Fourier Transforms\"
Query query = pm.newQuery (mags, filter);
query.declareVariables ("Article art;");
Collection results = (Collection) query.execute ();