Hibernate Criteria Query: A Comprehensive Guide
Hibernate provides a powerful querying mechanism through Criteria API, which allows developers to construct queries programmatically without writing SQL or HQL statements diretcly.
To initiate a Criteria query, the createCriteria() method of the Session interface is used to generate a Criteria instance for a specific entity class. Subsequently, query conditions are added using the add() method of the Criteria object.
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.eq("name", "Bill"));
List results = criteria.list();
Student student = (Student) results.get(0);
System.out.println(student.getName());
Common Restriction Methods
The Restrictions class offers various methods to define query constraints. These include:
eq()- Equality comparison (=)allEq()- Multiple equality checks using a Mapgt()- Greater than (> )lt()- Less than (<)le()- Less than or equal (<=)between()- Range condition (BETWEEN)like()- Pattern matching (LIKE)in()- Set membership (IN)and()- Logical ANDor()- Logical ORisNull()- Null value checkisNotNull()- Non-null value checkOrder.asc()- Ascending sortOrder.desc()- Descending sort
Examples
Filtering by Name Prefix
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "t%"));
List results = criteria.list();
Student student = (Student) results.get(0);
Alternatively:
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.like("name", "t", MatchMode.START));
List results = criteria.list();
Student student = (Student) results.get(0);
Using IN Clause
String[] names = {"Bill", "Jack", "Tom"};
Criteria criteria = session.createCriteria(Student.class);
criteria.add(Restrictions.in("name", names));
List results = criteria.list();
Student student = (Student) results.get(0);
Combining Conditions with OR
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq("age", new Integer(20)),
Restrictions.isNull("age")
));
List users = criteria.list();
Sorting Results
Sorting can be applied using Order.asc() or Order.desc() methods:
Criteria criteria = session.createCriteria(User.class);
criteria.addOrder(Order.asc("name"));
List users = criteria.list();
Limiting Result Sets
To restrict the number of returned records, use setMaxResults() and optionally setFirstResult() for pagination:
Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(51);
criteria.setMaxResults(50);
List users = criteria.list();
Aggregation Functions
Use Projections to perform aggregations:
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg("age"));
List results = criteria.list();
Grouping Results
Group results using Projections.groupProperty():
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty("age"));
List results = criteria.list();
Combine grouping with aggregation:
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("age"));
projectionList.add(Projections.rowCount());
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(projectionList);
List results = criteria.list();
Example-Based Queries
For querying based on an existing object:
User user = new User();
user.setAge(new Integer(30));
Criteria criteria = session.createCriteria(User.class);
criteria.add(Example.create(user));
List users = criteria.list();
Custom SQL Templates
Custom SQL restricitons can be defined using sqlRestriction():
Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.sqlRestriction(
"{alias}.name LIKE (?)", "cater%", Hibernate.STRING));
List users = criteria.list();
Join Fetching
Join fetching can be configured using setFetchMode():
Criteria criteria = session.createCriteria(Group.class);
criteria.setFetchMode("students", FetchMode.EAGER);
criteria.add(Restrictions.like("name", "2005", MatchMode.END));
List results = criteria.list();
This approach generates equivalent SQL:
SELECT g.*, s.* FROM Group g LEFT OUTER JOIN Student s ON g.id = s.group_id WHERE g.name LIKE '2005'