:_basedir: 
:_imagesdir: images/
:grid: cols
:query:

[[index]]

== JDOQL : Resultanchor:JDOQL_:_Result[]

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.

* _this_ - the candidate instance
* A field name
* A variable
* A parameter (though why you would want a parameter returning is hard
to see since you input the value in the first place)
* An aggregate (count(), avg(), sum(), min(), max())
* An expression involving a field (e.g "field1 + 1")
* A navigational expression (navigating from one field to another ...
e.g "field1.field4")

The result is specified in JDOQL like this

....
query.setResult("count(field1), field2");
....

In *Single-String JDOQL* you would specify it directly.

{empty} +


=== Result typeanchor:Result_type[]

What you specify in the _result_ defines what form of result you get
back.

* *Object* - this is returned if you have only a single row in the
results and a single column. This is achieved when you specified either
UNIQUE, or just an aggregate (e.g "max(field2)")
* *Object[]* - this is returned if you have only a single row in the
results, but more than 1 column (e.g "max(field1), avg(field2)")
* *List<Object>* - this is returned if you have only a single column in
the result, and you don't have only aggregates in the result (e.g
"field2")
* *List<Object[]>* - this is returned if you have more than 1 column in
the result, and you don't have only aggregates in the result (e.g
"field2, avg(field3)")

=== Aggregatesanchor:Aggregates[]

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 JDO2 aggregate functions available. These are

* *avg(val)* - returns the average of "val". "val" can be a field,
numeric field expression or "distinct field".
* *sum(val)* - returns the sum of "val". "val" can be a field, numeric
field expression, or "distinct field".
* *count(val)* - returns the count of records of "val". "val" can be a
field, or can be "this", or "distinct field".
* *min(val)* - returns the minimum of "val". "val" can be a field
* *max(val)* - returns the maximum of "val". "val" can be a field

So to utilise these you could specify something like

....
Query q = pm.newQuery("SELECT max(price), min(price) FROM mydomain.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.

{empty} +


=== Example - Use of aggregatesanchor:Example_-_Use_of_aggregates[]

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(mydomain.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 mydomain.Product WHERE name == \"CD Player\"");
List results = (List)query.execute();
Iterator iter = c.iterator();
Double max_price = (Double)iter.next();
....

{empty} +


