We discussed how to write named JDOQL queries in
Section 11.10, “Named Queries”. Named queries, however,
are not limited to JDOQL. By setting the query
element's language attribute to
javax.jdo.query.SQL, you can define a named SQL query. A
named SQL query within a class element queries for
instances of that class; a named SQL query outside of a class
element acts as a column data projection.
Example 17.7. Named SQL Queries
<?xml version="1.0"?>
<jdoquery>
<query name="salesReport" language="javax.jdo.query.SQL">
SELECT TITLE, PRICE * COPIES FROM MAG
</query>
<package name="org.mag">
<class name="Magazine">
<query name="findByTitle" language="javax.jdo.query.SQL">
SELECT * FROM MAG WHERE TITLE = ?
</query>
</class>
</package>
</jdoquery>
The salesReport query above returns the title
and revenue generated for each Magazine.
Because it is a projection, it does not have a candidate class, and
so we specify it at the root level.
The findByTitle query returns the
Magazine with the title given on execution. The code
below executes both queries.
PersistenceManager pm = ...;
Query query = pm.newNamedQuery (null, "salesReport");
List sales = (List) query.execute ();
for (Iterator itr = sales.iterator (); itr.hasNext ();)
{
Object[] salesData = (Object[]) itr.next ();
processSalesData ((String) salesData[0], (Number) salesData[1]);
}
query.close (sales);
query = pm.newNamedQuery (Magazine.class, "findByTitle");
query.setUnique (true);
Magazine jdj = (Magazine) query.execute ("JDJ");