As we have seen, a JDOQL query is made up of different parts. In this section we look at the result part of the query. The result is what we want returning. By default (when not specifying the result) the objects returned will be of the candidate class type, where they match the query filter. Firstly let's look at what you can include in the result clause.
The result is specified in JDOQL like this
query.setResult("count(field1), field2");In Single-String JDOQL you would specify it directly.
What you specify in the result defines what form of result you get back.
Note that if you specify unique you will be returned null or the object in question, and if there are more results than just 1 then it will throw a JDOUserException.
If you want results returned of a particular type per result row, you can specify a result class. The Result Class has to meet certain requirements. These are
In terms of how the Result Class looks, you have two options
public class Price
{
protected double amount = 0.0;
protected String currency = null;
public Price(double amount, String currency)
{
this.amount = amount;
this.currency = currency;
}
...
}
public class Price
{
protected double amount = 0.0;
protected String currency = null;
public Price()
{
}
public void setAmount(double amt) {this.amount = amt;}
public void setCurrency(String curr) {this.currency = curr;}
...
}There are situations when you want to return a single number for a column, representing an aggregate of the values of all records. There are 5 standard JDO aggregate functions available. These are
So to utilise these you could specify something like
Query q = pm.newQuery("SELECT max(price), min(price) FROM org.datanucleus.samples.store.Product WHERE status == 1");This will return a single row of results with 2 values, the maximum price and the minimum price of all products that have status code of 1.
JDO 2 introduces the ability to use aggregates in queries. Here's another example using the same Product class as above, but this time looking for the maximum price of products that are CD Players. Note that the result for this particular query will be of type Double since there is a single double precision value being returned via the "result".
Declarative JDOQL :
Query query = pm.newQuery(org.datanucleus.samples.store.Product.class);
query.setFilter("name == \"CD Player\"");
query.setResult("max(this.price)");
List results = (List)query.execute();
Iterator iter = c.iterator();
Double max_price = (Double)iter.next();
Single-String JDOQL :
Query query = pm.newQuery("SELECT max(price) FROM org.datanucleus.samples.store.Product WHERE name == \"CD Player\"");
List results = (List)query.execute();
Iterator iter = c.iterator();
Double max_price = (Double)iter.next();