Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Hibernate Criteria Query: A Comprehensive Guide

Tech 1

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 Map
  • gt() - Greater than (> )
  • lt() - Less than (<)
  • le() - Less than or equal (<=)
  • between() - Range condition (BETWEEN)
  • like() - Pattern matching (LIKE)
  • in() - Set membership (IN)
  • and() - Logical AND
  • or() - Logical OR
  • isNull() - Null value check
  • isNotNull() - Non-null value check
  • Order.asc() - Ascending sort
  • Order.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'

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.