How do I select a single record using Hibernate Criteria?

The Criteria.uniqueResult() method make it easier to query a single instance of a persistence object. When no persistence found this method will return a null value.

package org.kodejava.example.hibernate;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.criterion.Restrictions;
import org.kodejava.example.hibernate.model.Genre;

public class UniqueResultExample {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration()
                    .configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    public static void main(String[] args) {
        final Session session = getSession();
        try {
            Criteria criteria = session.createCriteria(Genre.class)
                    .add(Restrictions.eq("id", new Long(1)));

            // Convenience method to return a single instance that matches the
            // query, or null if the query returns no results.
            Object result = criteria.uniqueResult();
            if (result != null) {
                Genre genre = (Genre) result;
                System.out.println("Genre = " + genre.getName());
            }
        } finally {
            session.close();
        }
    }
}

How do I set the fetch mode for Criteria association?

To set the fetching mode for association we can call the Criteria‘s setFetchMode() method. We can user the FetchMode.SELECT or FetchMode.JOIN.

package org.kodejava.example.hibernate.criteria;

import org.hibernate.*;
import org.hibernate.criterion.Restrictions;
import org.hibernate.cfg.AnnotationConfiguration;
import org.kodejava.example.hibernate.model.Recording;

import java.util.List;

public class FetchModeDemo {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().
                    configure("hibernate.cfg.xml").
                    buildSessionFactory();
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        final Session session = getSession();
        try {
            Criteria criteria = session.createCriteria(Recording.class)
                    .setFetchMode("artist", FetchMode.SELECT)
                    .setFetchMode("label", FetchMode.SELECT)
                    .add(Restrictions.eq("title", "Please Please Me"));

            List recordings = criteria.list();
            for (Recording recording : recordings) {
                System.out.println("Recording  = " + recording.getTitle());
                System.out.println("Artist     = " + recording.getArtist().getName());
            }

        } finally {
            session.close();
        }
    }
}

How do I count the total records using Projections?

The example below show how to get total row count using the Projections.rowCount(). The result of this query will be a single object of Integer that contains the result of executing an SQL select count (*) command.

package org.kodejava.example.hibernate.criteria;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.Criteria;
import org.hibernate.criterion.Projections;
import org.hibernate.cfg.AnnotationConfiguration;
import org.kodejava.example.hibernate.model.Track;

import java.util.List;

public class ProjectionsCountDemo {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().
                    configure("hibernate.cfg.xml").
                    buildSessionFactory();
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        final Session session = getSession();
        try {
            Criteria criteria = session.createCriteria(Track.class)
                    .setProjection(Projections.rowCount());

            List result = criteria.list();
            if (!result.isEmpty()) {
                Integer rowCount = (Integer) result.get(0);
                System.out.println("Total records: " + rowCount);
            }
        } finally {
            session.close();
        }
    }
}

How do I order the Criteria query resultset?

In this demo you’ll see how to order the resultset of out Criteria query. It can be done by adding the org.hibernate.criterion.Order into the Criteria object and we can either order the result in ascending or descending order.

package org.kodejava.example.hibernate.criteria;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.cfg.AnnotationConfiguration;
import org.kodejava.example.hibernate.model.Track;

import java.util.List;

public class CriteriaOrderDemo {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().
                    configure("hibernate.cfg.xml").
                    buildSessionFactory();
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        final Session session = getSession();
        try {
            Criteria criteria = session.createCriteria(Track.class)
                    .addOrder(Order.asc("title"))
                    .setFirstResult(0)
                    .setMaxResults(10);

            List tracks = criteria.list();
            for (Track track : tracks) {
                System.out.println("Track = " + track.getTitle());
            }
        } finally {
            session.close();
        }
    }
}

How do I add Restrictions to the Criteria object?

In this example you’ll learn how to add restrictions to the Criteria object. Using restriction we can narrow the result of our query. In the code below we add some restrictions such as Restrictions.eq(), Restrictions.like() and Restrictions.isNotNull().

In the Hibernate framework you’ll find a lot of class the use a method chaining. As in the example below you can see that we actually can add an endless restrictions by calling the add() method.

package org.kodejava.example.hibernate.criteria;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.cfg.AnnotationConfiguration;
import org.kodejava.example.hibernate.model.Track;

import java.util.List;

public class RestrictionsDemo {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().
                    configure("hibernate.cfg.xml").
                    buildSessionFactory();
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        final Session session = getSession();
        try {
            Criteria criteria = getSession().createCriteria(Track.class)
                    .createAlias("artist", "artist")
                    .createAlias("genre", "genre")
                    .add(Restrictions.eq("title", "Misery"))
                    .add(Restrictions.like("artist.name", "%beatles%"))
                    .add(Restrictions.isNotNull("genre.name"));

            List tracks = criteria.list();
            for (Track track : tracks) {
                System.out.println("Track = " + track.getTitle() +
                        "; Artist = " + track.getArtist().getName() +
                        "; Genre = " + track.getGenre().getName());
            }
        } finally {
            session.close();
        }
    }
}

Here are some other restrictions that can also be use to narrow our Criteria query result, for a complete restrictions you can see the Restrictions class documentation.

  • Restrictions.ne("title", "Twist and Shout") – Apply a “not equal” constraint to the named property.
  • Restrictions.ilike("title", "Twist%") – A case-insensitive “like”.
  • Restrictions.isNull("title") – Apply an “is null” constraint to the named property.
  • Restrictions.gt("duration", new Integer(200)) – Apply a “greater than” constraint to the named property.
  • Restrictions.between("duration", new Integer(100), new Integer(200)) – Apply a “between” constraint to the named property
  • Restrictions.or(criterionA, criterionB) – Return the disjuction of two expressions.
  • Restrictions.disjuction() – Group expressions together in a single disjunction.

How do I create a pagination using Criteria?

To create a pagination or limit the resultset returned by the Criteria query we can use the setFirstResult() and setMaxResults() method. The setFirstResult() method defines the first row to start with and the setMaxResults() method defines the maximum number of records to read. Let’s see the demo below.

package org.kodejava.example.hibernate.criteria;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.Criteria;
import org.hibernate.cfg.AnnotationConfiguration;
import org.kodejava.example.hibernate.model.Track;

import java.util.List;

public class CriteriaPagingDemo {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().
                    configure("hibernate.cfg.xml").
                    buildSessionFactory();
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        final Session session = getSession();
        try {
            Criteria criteria = session.createCriteria(Track.class);

            //
            // Set the first record index to read from the result set.
            //
            criteria.setFirstResult(0);
            //
            // Set the maximum number of records to read
            //
            criteria.setMaxResults(2);

            List tracks = criteria.list();
            for (Track track : tracks) {
                System.out.println("Track = " + track.getTitle());
            }
        } finally {
            session.close();
        }
    }
}

How do I create a Criteria object?

This example show you how to create an instance of Hibernate Criteria class. To create a Criteria we call the factory method of the Session object and pass the persistence class as parameter. To execute the Criteria query we simply call the list() method.

package org.kodejava.example.hibernate.criteria;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.HibernateException;
import org.hibernate.Criteria;
import org.hibernate.cfg.AnnotationConfiguration;
import org.kodejava.example.hibernate.model.Track;

import java.util.List;

public class CreateCriteriaDemo {
    private static final SessionFactory sessionFactory;

    static {
        try {
            sessionFactory = new AnnotationConfiguration().
                    configure("hibernate.cfg.xml").
                    buildSessionFactory();
        }
        catch (Throwable ex) {
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static Session getSession() throws HibernateException {
        return sessionFactory.openSession();
    }

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        final Session session = getSession();

        try {
            //
            // Create a new Criteria to query for a collection of Tracks. To create
            // an instance of Criteria we call a createCriteria() factory method of
            // the Session object.
            //
            Criteria criteria = session.createCriteria(Track.class);

            //
            // Call the list() method to retrieve a collections of Tracks from the
            // database.
            //
            List tracks = criteria.list();

            for (Track track : tracks) {
                System.out.println("Title     = " + track.getTitle());
                System.out.println("Artist    = " + track.getArtist().getName());
                System.out.println("Genre     = " + track.getGenre().getName());
                System.out.println("Recording = " + track.getRecording().getTitle());
                System.out.println("Label     = " + track.getRecording().getLabel().getName());
                System.out.println("--------------------------------------------------");
            }
        } finally {
            session.close();
        }
    }
}

How do I limit the Hibernate query result?

In the example below you’ll see how to limit the number of records returned by the Hibernate queries. Limiting the query result usually used from created a pagination result where we can navigate from page to page in our application data but only a few data are read from the database.

In the Hibernate’s Query object we need to specify the first result and max results by calling the setFirstResult() and setMaxResults() methods.

package org.kodejava.example.hibernate.app;

import org.hibernate.Query;
import org.hibernate.Session;
import org.kodejava.example.hibernate.model.Label;

import java.util.List;

public class LabelManager {

    public List getLabels(Label label, int pageNumber, int pageSize) {
        Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Query query = session.createQuery("from Label");

        //
        // Set the first record position and the max number of record to be read.
        // The setFirstResult() tell hibernate from which row the data should be
        // read. In the example if we have pages of 10 records, passing the page
        // number 2 will read 10 records from the 20th row in the selected records.
        //
        query.setFirstResult((pageNumber - 1) * pageSize);
        query.setMaxResults(pageSize);

        List labels = query.list();
        session.getTransaction().commit();
        return labels;
    }
}
package org.kodejava.example.hibernate.app;

import org.kodejava.example.hibernate.model.Label;

import java.util.List;

public class LimitDemo {
    public static void main(String[] args) {
        LabelManager manager = new LabelManager();

        List labels = manager.getLabels(null, 1, 10);
        for (int i = 0; i < labels.size(); i++) {
            Label label = (Label) labels.get(i);
            System.out.println("Label = " + label);
        }
    }
}

How do I retrieve a list of Hibernate’s persistent objects?

In this example we add the function to read a list of records in our LabelManager class. This function will read all Label persistent object from database. You can see the other functions such as saveLabel, getLabel and deleteLabel in the related example section of this example.

package org.kodejava.example.hibernate.app;

import org.hibernate.Query;
import org.hibernate.Session;
import org.kodejava.example.hibernate.model.Label;

import java.util.List;

public class LabelManager {

    public List getLabels() {
        Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        //
        // We read labels record from database using a simple Hibernate query,
        // the Hibernate Query Language (HQL).
        //
        List labels = session.createQuery("from Label").list();
        session.getTransaction().commit();

        return labels;
    }
    
    public void saveLabel(Label label) {
        //
        // To save an object we first get a session by calling getCurrentSession()
        // method from the SessionFactoryHelper class. Next we create a new
        // transaction, save the Label object and commit it to database,
        //
        Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();

        session.beginTransaction();
        session.save(label);
        session.getTransaction().commit();
    }    
}
package org.kodejava.example.hibernate.app;

import org.kodejava.example.hibernate.model.Label;

import java.util.Date;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
        LabelManager manager = new LabelManager();

        //
        // Creates a Label object we are going to stored in the database. We
        // set the name, modified by and modified date information.
        //
        Label label = new Label();
        label.setName("Sony Music");
        label.setCreated(new Date());

        //
        // Call the LabelManager saveLabel method.
        //
        manager.saveLabel(label);

        List labels = manager.getLabels();
        for (int i = 0; i < labels.size(); i++) {
            label = (Label) labels.get(i);
            System.out.println("Label = " + label);
        }
    }
}

How do I delete persistent object in Hibernate?

Continuing the previous example How do I get object from database in Hibernate?, we now add the delete function in our LabelManager class.

package org.kodejava.example.hibernate.app;

import org.hibernate.Query;
import org.hibernate.Session;
import org.kodejava.example.hibernate.model.Label;

import java.util.List;

public class LabelManager {
    public void deleteLabel(Integer id) {
        //
        // Load the object to be deleted
        //
        Label label = getLabel(id);

        //
        // We get the current session and delete the Label object from database.
        //
        Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        session.delete(label);
        session.getTransaction().commit();
    }
}
package org.kodejava.example.hibernate.app;

import org.kodejava.example.hibernate.model.Label;

import java.util.Date;

public class DeleteDemo {
    public static void main(String[] args) {
        LabelManager manager = new LabelManager();

        //
        // Creates a Label object we are going to stored in the database. We
        // set the name and created date information.
        //
        Label label = new Label();
        label.setName("Sony Music");
        label.setCreated(new Date());

        //
        // Call the LabelManager saveLabel method.
        //
        manager.saveLabel(label);

        //
        // Read the object back from database.
        //
        label = manager.getLabel(label.getId());
        System.out.println("Label = " + label);

        manager.deleteLabel(label.getId());
    }
}