Java Reference
In-Depth Information
To use projections, start by getting the org.hibernate.criterion.Projection object you
need from the org.hibernate.criterion.Projections factory class. The Projections class is
similar to the Restrictions class in that it provides several static factory methods for obtain-
ing Projection instances. After you get a Projection object, add it to your Criteria object with
the setProjection() method. When the Criteria object executes, the list contains object ref-
erences that you can cast to the appropriate type.
The row-counting functionality provides a simple example of applying projections. The
code looks similar to the restrictions examples we were working with earlier in the chapter:
Criteria crit = session.createCriteria(Product.class);
crit.setProjection(Projections.rowCount());
List results = crit.list();
The results list will contain one object, an Integer that contains the results of executing
the COUNT SQL statement. Other aggregate functions available through the Projections factory
class include the following:
avg(String propertyName) : Gives the average of a property's value
count(String propertyName) : Counts the number of times a property occurs
countDistinct(String propertyName) : Counts the number of unique values the
property contains
max(String propertyName) : Calculates the maximum value of the property values
min(String propertyName) : Calculates the minimum value of the property values
sum(String propertyName) : Calculates the sum total of the property values
We can apply more than one projection to a given Criteria object. To add multiple pro-
jections, get a projection list from the projectionList() method on the Projections class. The
org.hibernate.criterion.ProjectionList object has an add() method that takes a Projection
object. You can pass the projections list to the setProjection() method on the Criteria object
because ProjectionList implements the Projection interface. The following example demon-
strates some of the aggregate functions, along with the projection list:
Criteria crit = session.createCriteria(Product.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.max("price"));
projList.add(Projections.min("price"));
projList.add(Projections.avg("price"));
projList.add(Projections.countDistinct("description"));
crit.setProjection(projList);
List results = crit.list();
When you execute multiple aggregate projections, you get a List with an Object array as
the first element. The Object array contains all of your values, in order.
Another use of projections is to retrieve individual properties, rather than entities. For
instance, we can retrieve just the name and description from our product table, instead of
faulting the classes into memory. Use the property() method on the Projections class to
Search WWH ::




Custom Search