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