hibernatehibernate-criteriacriteria-api

Migrating from Hibernate 4.X to 6.X Projections deprecated


I am migrating from Hibernate 4 to Hibernate 6 and I am not sure if the code I have written is the equivalent code from the Old Code Snippet for Projections.

Old Code Snippet

Criteria criteria = getCurrentSession().createCriteria(ABCD.class);
criteria.add(Restrictions.eq("123", "456");
Long ll = ((Long) criteria.setProjection(Projections.rowCount()).uniqueResult();

New Code Snippet

CriteriaBuilder criteriaBuilder = getCurrentSession().getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root<ABCD> root = criteriaQuery.from(ABCD.class);
criteriaQuery.select(root);
criteriaQuery.where(criteriaBuilder.equal(root.get("123"), "456"));
criteriaQuery.select(criteriaBuilder.count(root));
Long ll = getCurrentSession().createQuery(criteriaQuery).getSingleResult();

Here the Line criteria.setProjection(Projections.rowCount()) has been replaced by criteriaQuery.select(criteriaBuilder.count(root)); Is it logically correct?


Solution

  • There's no way to write count(*) in the criteria API, but Christian Beikov suggests using count(1), that is:

    criteriaBuilder.count(criteriaBuilder.literal(1))
    

    which is a bit more robust than your suggestion.