Thursday, February 4, 2010

Appendix B. The Criteria API








Appendix B. The Criteria API


Criteria queries start by obtaining a Criteria object from the Session, using the
createCriteria⁠⁠(⁠ ⁠) method
to identify the primary class (and thus table) on which the query is to be
performed. Restrictions, projections, and orderings are then attached to the
query using the factories described below, making it a very powerful and
convenient interface.




B.1. The Criterion Factory


Hibernate provides the class
org.hibernate.criterion.Restrictions as a factory
for creating the Criterion instances you use to
narrow down the objects (rows) you want from criteria queries.
Restrictions defines a bunch of static methods you
can invoke to conveniently create each of the standard
Criterion implementations available in Hibernate,
using parameters you supply. These criteria are used to determine which
persistent objects from the database are included in the results of your
query. The following table provides a summary of the available
options.


MethodParametersPurpose

allEq

Map propertiesA shortcut for requiring several properties to
have particular values. The keys of the supplied map are the names
of the properties you want to constrain, while the values in the
map are the target values each property must equal if an entity is
to be included in the query results. The returned
Criterion ensures that each named
property has the corresponding value.

and

Criterion lhs, Criterion rhsBuilds a compound
Criterion that requires both halves to be
met in order for the whole to succeed. See also
conjunction⁠⁠(⁠ ⁠).

between

String property,
Object low, Object
high
Requires the value of the named property to
fall between the values of low and
high.

conjunction

NoneCreates a Conjunction
object which can be used to build an "and" criterion with as many
pieces as you need. Simply call its
add⁠⁠(⁠ ⁠) method with each of the
Criterion instances you want to check.
The conjunction will be true if and only if all its component
criteria are true. This is more convenient than building a tree of
and⁠⁠(⁠ ⁠) criteria "by hand." The
add⁠⁠(⁠ ⁠) method of the
Criteria interface acts as though it
contains a Conjunction.

disjunction

NoneCreates a Disjunction
object that can be used to build an "or" criterion with as many
pieces as you need. Simply call its
add⁠⁠(⁠ ⁠) method with each of the
Criterion instances you want to check. The
disjunction will be true if any of its component criteria are
true. This is more convenient than building a tree of
or⁠⁠(⁠ ⁠) criteria "by hand." See Example 8-10.

eq

String property,
Object value
Requires the named property to have the
specified value.

eqProperty

String property1,
String property2
Requires the two named properties to have the
same value.

ge

String property,
Object value
Requires the named property to be greater than
or equal to the specified value.

geProperty

String property1,
String property2
Requires the first named property to be
greater than or equal to the second.

gt

String property,
Object value
Requires the named property to be greater than
the specified value.

gtProperty

String property1,
String property2
Requires the first named property to be
greater than the second.

idEq

Object valueRequires the identifier property to be equal
to the specified value.

ilike

String property,
Object value
A case-insensitive "like" operator. See
like.

ilike

String property,
String value,
MatchMode mode
A case-insensitive "like" operator for people
who don't want to mess with "like" syntax and just want to match a
substring. MatchMode is a type-safe
enumeration with values START,
END, ANYWHERE, and EXACT. This method adjusts the syntax of
value to reflect the kind
of matching specified by mode, then proceeds like the
two-parameter ilike⁠⁠(⁠ ⁠).

in

String property, Collection valuesA shortcut for allowing the named property to
have any of the values contained in the collection. This is more
convenient than building up a
disjunction⁠⁠(⁠ ⁠) of
eq⁠⁠(⁠ ⁠) criteria "by hand."

in
String property,
Object[] values
A shortcut for allowing the named property to
have any of the values contained in the array. This is more
convenient than building up a
disjunction⁠⁠(⁠ ⁠) of
eq⁠⁠(⁠ ⁠) criteria "by hand."

isEmpty

String propertyRequires the named collection property to be
empty (have zero length).

isNotEmpty

String propertyRequires the named collection property to be
have one or more elements.

isNotNull

String propertyRequires the named property to have a value
other than null.

isNull

String propertyRequires the named property to be null.

le

String property,
Object value
Requires the named property to be less than or
equal to the specified value. See Example 8-3.

leProperty

String property1,
String property2
Requires the first named property to be less
than or equal to the second.

like

String property,
Object value
Requires the named property to be "like" the
specified value (in the sense of the SQL like
operator, which allows simple substring matching). See Examples
Example 8-8 and Example 8-16.

like
String property,
String value,
MatchMode mode
A "like" operator for people who don't want to
mess with "like" syntax and just want to match a substring. See
ilike⁠⁠(⁠ ⁠) for more details.

lt

String property,
Object value
Requires the named property to be less than
the specified value.

ltProperty

String property1,
String property2
Requires the first named property to be less
than the second.

naturalId

NoneAllows selection through a multicolumn
"natural business key" mapped using <natural-id>.

ne

String property,
Object value
Requires the named property to have any value
other than the specified value.

neProperty

String property1,
String property2
Requires the two named properties to have
different values.

not

Criterion expressionNegates the supplied
Criterion (if it matched, this one fails,
and vice versa).

or

Criterion lhs, Criterion rhsBuilds a compound
Criterion that succeeds if either of its
halves matches. See also
disjunction⁠⁠(⁠ ⁠).

sizeEq

String property, int sizeRequires the named collection property to have
the specified number of elements.

sizeGe

String property, int sizeRequires the named collection property to have
at least the specified number of elements.

sizeGt

String property, int sizeRequires the named collection property to have
more than the specified number of elements.

sizeLe

String property, int sizeRequires the named collection property to have
no more than the specified number of elements.

sizeLt

String property, int sizeRequires the named collection property to have
fewer than the specified number of elements.

sizeNe

String property, int sizeRequires the named collection property to have
a different number of elements than size.

sqlRestriction

String sqlApplies a constraint expressed in the native
SQL dialect of the underlying database system. This can be very
powerful, but be aware it might lead to loss of
portability.

sqlRestriction
String sql, Object[]
values,
Type[] types
Applies a constraint expressed in the native
SQL of the underlying database, with the supplied JDBC parameters.
This can be very powerful, but be aware it might lead to loss of
portability.

sqlRestriction
String sql, Object
value,
Type type
Applies a constraint expressed in the native
SQL of the underlying database, with the supplied JDBC parameter.
This can be very powerful, but be aware it might lead to loss of
portability.



When specifying query text for the
sqlRestriction⁠⁠(⁠ ⁠) methods, any occurrences of
the string "{alias}" within the query
will be replaced by the actual alias of the table on which the query is
being performed.


Many of these methods accept Criterion
instances as arguments, allowing you to build compound criteria trees with
as much complexity as you need.
conjunction⁠⁠(⁠ ⁠) and disjunction⁠⁠(⁠ ⁠) return objects
that make it even easier to add criteria, by returning objects with
add⁠⁠(⁠ ⁠) methods you can call as many times as
you'd like to add criteria. If your query gets sufficiently complex,
however, it might be easier to express and understand in
HQL. There are also a few remaining kinds of queries
that are not yet supported by this API, so you may not
always be able to avoid HQL. But that's becoming
increasingly rare—most of the kinds of bread-and-butter queries that come
up all the time in application development are expressed very naturally
and easily in this API, leading to readable and compact
Java code that can be checked for correctness at compile-time.









No comments: