Criteria in Hibernate Example

In this tutorial of Criteria in Hibernate Example we will discuss about the Criteria API of hibernate it is using for fetching data from the database in the Hibernate.

There are three way to pulling data from the database in the Hibernate.
  1. Using session methods(get() and load() methods)  -limited control to accessing data
  2. Using HQL - Slightly more control using where clause and other clauses but there are some problems here... is more complicated to maintain in case of bigger queries with lots of clauses.
  3. Using Criteria API
The API (Application Programming Interface) of Hibernate Criteria provides an elegant way of building dynamic query on the persistence database.

The hibernate criteria API is very Simplified API for fetching data from Criterion objects. The criteria API is an alternative of HQL (Hibernate Query Language) queries. It is more powerful and flexible for writing tricky criteria functions and dynamic queries

1. Using Criteria API to create criteria:
Criteria criteria = session.createCriteria(Student.class);

2. The Criteria API supports all the comparision operators such as =, <, >, >=,=<, etc in the supported Expression class eq(), lt(), gt(), le() , ge() respectively.
Criteria criteria = session.createCriteria(Student.class);

criteria.add(Restrictions.eq("studentName", "Dinesh Rajput"));

criteria.add(Restrictions.le("rollNumber", 1));

3. Criteria ordering query
The result is sort by "studentName" in ascending order.
Criteria criteria = session.createCriteria(Student.class);
The result is sort by "studentName" in descending order.
Criteria criteria = session.createCriteria(Student.class);
4. Criteria paging the result
Criteria provide some functions to make pagination extremely easy. Starting from the 5th record, and retrieve the next 10 records from database.
Criteria criteria = session.createCriteria(Student.class);

Problem with Criteria API

1. Performance issue
You have no way to control the SQL query generated by Hibernate, if the generated query is slow, you are very hard to tune the query, and your database administrator may not like it.

2. Maintenance issue
All the SQL queries are scattered through the Java code, when a query went wrong, you may spend time to find the problem query in your application. On the others hand, named queries stored in the Hibernate mapping files are much more easier to maintain.
package com.sdnext.hibernate.tutorial.dto;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

public class Student implements Serializable 

  * serialVersionUID
 private static final long serialVersionUID = 8633415090390966715L;
 private int id;
 private String studentName;
 private int rollNumber;
 private String course;
 public int getId() {
  return id;
 public void setId(int id) {
  this.id = id;
 public String getStudentName() {
  return studentName;
 public void setStudentName(String studentName) {
  this.studentName = studentName;
 public int getRollNumber() {
  return rollNumber;
 public void setRollNumber(int rollNumber) {
  this.rollNumber = rollNumber;
 public String getCourse() {
  return course;
 public void setCourse(String course) {
  this.course = course;
 public String toString()
  return "ROLL Number: "+rollNumber+"| Name: "+studentName+"| Course: "+course;
  <!-- Database connection settings -->
   <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
   <property name="connection.url">jdbc:mysql://localhost:3306/hibernateDB2</property> 
   <property name="connection.username">root</property> 
   <property name="connection.password">root</property> 

  <!-- JDBC connection pool (use the built-in) -->
   <property name="connection.pool_size">1</property> 

  <!-- SQL dialect -->
   <property name="dialect">org.hibernate.dialect.MySQLDialect</property> 

  <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property> 
  <!-- Disable the second-level cache -->
   <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 

  <!-- Echo all executed SQL to stdout -->
   <property name="show_sql">true</property> 
  <!-- Drop and re-create the database schema on startup -->
   <property name="hbm2ddl.auto">update</property> 
   <mapping class="com.sdnext.hibernate.tutorial.dto.Student">
package com.sdnext.hibernate.tutorial;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Restrictions;

import com.sdnext.hibernate.tutorial.dto.Student;

public class HibernateTestDemo {

  * @param args
 public static void main(String[] args) 
  SessionFactory sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
  Session session = sessionFactory.openSession();
  Criteria criteria = session.createCriteria(Student.class);
  criteria.add(Restrictions.eq("studentName", "Dinesh Rajput"));
  List students = criteria.list();
  for(Student student : students)

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select this_.ID as ID0_0_, this_.COURSE as COURSE0_0_, this_.ROLL_NUMBER as ROLL3_0_0_, this_.STUDENT_NAME as STUDENT4_0_0_ from STUDENT this_ where this_.STUDENT_NAME=?
ROLL Number: 1| Name: Dinesh Rajput| Course: MCA

Criteria in Hibernate Example

 In the Next Chapter we will discuss more about the Criteria Query with Restriction.

                   <<Previous Chapter 29<<    >>Next Chapter 31>>