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 ();