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?
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.