17.4. Named SQL Queries

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

 

Skip navigation bar   Back to Top