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.hibernate;

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

import java.util.List;

public class ProjectionsCountDemo {
    public static Session getSession() throws HibernateException {
        String cfg = "hibernate.cfg.xml";
        SessionFactory sessionFactory = new Configuration().configure(cfg)
                .buildSessionFactory();
        return sessionFactory.openSession();
    }

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

            List<?> result = criteria.list();
            if (!result.isEmpty()) {
                Long rowCount = (Long) result.get(0);
                System.out.println("Total records: " + rowCount);
            }
        }
    }
}

Maven Dependencies

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.6.9.Final</version>
    </dependency>
    <dependency>
        <groupId>com.mysql</groupId>
        <artifactId>mysql-connector-j</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>

Maven Central Maven Central

Wayan

4 Comments

    • Hi Dybuk,

      You can use the JPA Criteria API as the replacement for the deprecated Hibernate API.

      EntityManagerFactory factory =
          Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
      EntityManager em = factory.createEntityManager();
      
      CriteriaBuilder builder = em.getCriteriaBuilder();
      CriteriaQuery<Long> query = builder.createQuery(Long.class);
      query.select(builder.count(query.from(Track.class)));
      
      Long count = em.createQuery(query).getSingleResult();
      System.out.println("count = " + count);
      
      Reply
  1. List result = criteria.list(); is not the correct way.

    Instead, use as following.

    Long rowCount = (Long) criteria.uniqueResult();

    Reply
  2. PS: Not related to this post

    Hi,

    There is a “Views: 8,799” on this page, could you point me to an article which has some information on how to manage views on a UI screen, if you already have one or provide some information on how it could be done.

    Thanks

    Reply

Leave a Reply to Wayan SaryadaCancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.