6

次の JPQL クエリを表す方法がわかりません。

SELECT count(e) FROM Foo e

基準 API を使用します。私がしようとしているのは:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> c = cb.createQuery(Foo.class);
Root<Foo> f = c.from(Foo.class);
c.select(cb.count(f));

しかし、これは機能していません。私も試しました:

c.select(cb.count(f.get("id"));

これはJPA2、Eclipselink用です。

4

2 に答える 2

11

これを試してください。これは休止状態 3.5.1 で動作しています:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> c = cb.createQuery(Long.class);
Root<Foo> f = c.from(Foo.class);
c.select(cb.count(f));
int count = em.createQuery(c).getSingleResult().intValue();
于 2010-04-16T11:04:25.443 に答える
5

これはかなり古い質問ですが、完全を期すために簡単な追加を以下に示します。

タイトルは「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();
于 2012-02-28T14:56:45.327 に答える