Author: ppoddar
Date: Wed Dec 17 11:27:07 2008
New Revision: 727479

URL: http://svn.apache.org/viewvc?rev=727479&view=rev
Log:
OPENJPA-800: Documentation for new Criteria API support

Added:
    openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
Modified:
    openjpa/trunk/openjpa-project/src/doc/manual/manual.xml

Added: openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_criteria.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_criteria.xml?rev=727479&view=auto
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_criteria.xml 
(added)
+++ openjpa/trunk/openjpa-project/src/doc/manual/jpa_overview_criteria.xml Wed 
Dec 17 11:27:07 2008
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+ 
+ http://www.apache.org/licenses/LICENSE-2.0
+ 
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.   
+-->
+<chapter id="jpa_overview_criteria">
+    <title>
+        JPA Criteria
+    </title>
+    <indexterm zone="jpa_overview_criteria">
+        <primary>
+            JP Criteria
+        </primary>
+        <seealso>
+            JPQL
+        </seealso>
+    </indexterm>
+    <indexterm>
+        <primary>
+            queries
+        </primary>
+        <see>
+            Query
+        </see>
+    </indexterm>
+    <para>
+    JPA 2.0 Specification introduces a new API to define queries dynamically
+    via construction of an object-based 
+    <classname>javax.persistence.QueryDefinition</classname> instance, rather
+    than string-based approach used in JPQL (Java Persistence Query Language).
+    This dynamic query definition capability, referred as Criteria API, is 
+    based on the abstract persistent schema of the entities, their embedded
+    objects and their relationships. The syntax is designed to construct a
+    <emphasis>Query Tree</emphasis> whose nodes represent the semantic query
+    elements such as projections, conditional predicates of WHERE clause or
+    GROUP BY elements etc. 
+    </para>
+    
+    <section>
+       <title>Constructing a QueryDefinition</title>
+       <para>
+       The QueryBuilder interface is the factory for QueryDefinition. A
+       QueryBuilder is obtained from either the EntityManagerFactory or 
+       the EntityManager as follows:
+       <programlisting>
+EntityManager em = ... ; 
+QueryBuilder queryBuilder = em.getQueryBuilder();
+QueryDefinition qdef = queryBuilder.createQueryDefinition();
+       </programlisting>
+       The first step in constructing a query definition is specification of 
+       query roots.  Query roots specify the domain objects on which the query 
+       is evaluated. Query root is an instance of the DomainObject interface. A
+       query root is added to a QueryDefinition by 
+       <methodname>addRoot(Class c)</methodname> method.
+       <programlisting>
+       DomainObject customer = qdef.addRoot(Customer.class);
+       </programlisting>
+       Often a query definition has a single root, so the 
+       QueryBuilder interface allows to construct and add
+       a root via a single method.
+       <programlisting>
+DomainObject customer = queryBuilder.createQueryDefinition(Customer.class);    
        
+       </programlisting>
+       A query domain can be further refined by joining to other domain 
objects.
+       For example, for the above query definition to operate over customers 
+       and their orders, use <methodname>join(String attribute)</methodname>:
+               <programlisting>
+DomainObject order = customer.join("orders");
+               </programlisting>  
+               The condition of a query definition is set via 
+               <methodname>where(Predicate p)</methodname> where the argument 
+               designates a conditional predicate. Conditional predicates are 
often
+               composed of one or more comparisons between the attribute 
values of
+               the domain objects and some variable. For example, to select the
+               Customers whose name is <emphasis>John Doe</emphasis> and has 
+               orders that are not yet delivered, you can build the predicate 
and set  
+               it to the query definition as
+               <programlisting>
+qdef.where(customer.get("name").equal("John Doe")
+      .and(order.get("status").equal(OrderStatus.DELIVERED).not()));
+               </programlisting>
+               The <methodname>select()</methodname> method defines the result 
of the
+               query. If left unspecified, the select projection is assumed to 
be the
+               root domain object. However, you can specify the selected 
projections
+               explicitly as a list 
+               <programlisting>
+qdef.select(customer.get("name"), order.get("status"));
+               </programlisting>
+               Attribute of a domain object is specified by navigating via 
+               <methodname>get(String attr)</methodname>. The attribute 
+               <emphasis>should</emphasis> refer
+               to a valid persistent property of the receiving domain object, 
however
+               no such validation is enforced during the construction of the 
query 
+               definition. All validation is deferred till query is actually 
executed.
+       </para>
+    </section> 
+    
+    <section>
+    <title>Executing a QueryDefinition</title>
+    <para>
+    A QueryDefinition is executed in a similar fashion of a string-based JPQL
+    query via the EntityManager and Query interfaces.
+    <programlisting>
+EntityManager em = ...
+Query query = em.createQuery(qdef);
+List result = query.getResultList();    
+    </programlisting>
+    </para>
+    <para>
+    A query definition can use named parameters, and the parameter values are
+    set as usual in the Query instance. 
+    </para>
+    
+    <para>
+    The JPA 2.0 Specification on Criteria API is evolving and hence for an
+    up-to-date version of the API, please consult the  
+    <ulink 
url="http://jcp.org/aboutJava/communityprocess/pr/jsr317/index.html";>
+    public draft</ulink>.
+    </para>
+    </section>
+    
+    <section>
+    <title>Extension to Criteria API</title>
+    <para>
+    Criteria API has provided an alternative means to string-based JPQL to 
+    execute a query. However, JPA 2.0 Specification has not explicitly 
specified 
+    any equivalence between a dynamically constructed QueryDefinition and
+    a JPQL string. OpenJPA provides a mechanism to convert a QueryDefinition to
+    an equivalent JPQL query string via the extended OpenJPAQueryBuilder API.
+    <programlisting>
+       public interface OpenJPAQueryBuilder extends QueryBuilder {
+                       /**
+                        * Gets equivalent JPQL String for the given 
QueryDefinition.
+                       */
+                       public String toJPQL(QueryDefinition qdef);
+               }
+       </programlisting>
+    
+    </para>
+    </section>
+
+</chapter>

Modified: openjpa/trunk/openjpa-project/src/doc/manual/manual.xml
URL: 
http://svn.apache.org/viewvc/openjpa/trunk/openjpa-project/src/doc/manual/manual.xml?rev=727479&r1=727478&r2=727479&view=diff
==============================================================================
--- openjpa/trunk/openjpa-project/src/doc/manual/manual.xml (original)
+++ openjpa/trunk/openjpa-project/src/doc/manual/manual.xml Wed Dec 17 11:27:07 
2008
@@ -31,7 +31,8 @@
     <!ENTITY jpa_overview_emfactory.xml SYSTEM "jpa_overview_emfactory.xml">
     <!ENTITY jpa_overview_em.xml SYSTEM "jpa_overview_em.xml">
     <!ENTITY jpa_overview_trans.xml SYSTEM "jpa_overview_trans.xml">
-    <!ENTITY jpa_overview_query.xml SYSTEM "jpa_overview_query.xml">
+    <!ENTITY jpa_overview_query.xml SYSTEM "jpa_overview_query.xml">
+    <!ENTITY jpa_overview_criteria.xml SYSTEM "jpa_overview_criteria.xml">
     <!ENTITY jpa_overview_sqlquery.xml SYSTEM "jpa_overview_sqlquery.xml">
     <!ENTITY jpa_overview_mapping.xml SYSTEM "jpa_overview_mapping.xml">
     <!ENTITY jpa_overview_conclusion.xml SYSTEM "jpa_overview_conclusion.xml">
@@ -75,7 +76,8 @@
         &jpa_overview_emfactory.xml;
         &jpa_overview_em.xml;
         &jpa_overview_trans.xml;
-        &jpa_overview_query.xml;
+        &jpa_overview_query.xml;
+        &jpa_overview_criteria.xml;
         &jpa_overview_sqlquery.xml;
         &jpa_overview_mapping.xml;
         &jpa_overview_conclusion.xml;


Reply via email to