これはかなり古い質問ですが、完全を期すために簡単な追加を以下に示します。
タイトルは「countDistinct の使用」について述べているため、ここで countDistinct について言及する必要があります。
CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class);
Root<Foo> root = critQuery.from(Foo.class);
critQuery.select(critBuilder.countDistinct(root));
int count = entityManager.createQuery(critQuery).getSingleResult().intValue();
double の行をカウントしたくない場合、これは重要です。ResultList で doule 行を回避したい場合は、次を使用する必要がありました。
CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class);
Root<Foo> root = critQuery.from(Foo.class);
critQuery.select(root).distinct(true);
List<Foo> result = entityManager.createQuery(critQuery).getResultList();