首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在JPA2中,使用CriteriaQuery,如何计算结果

在JPA2中,使用CriteriaQuery,如何计算结果
EN

Stack Overflow用户
提问于 2010-05-22 00:40:59
回答 6查看 163.7K关注 0票数 130

我对JPA2比较陌生,它是CriteriaBuilder / CriteriaQuery API:

CriteriaQuery javadoc

CriteriaQuery in the Java EE 6 tutorial

我想对CriteriaQuery的结果进行计数,而不实际检索它们。有没有可能,我没有找到这样的方法,唯一的办法就是这样做:

代码语言:javascript
复制
CriteriaBuilder cb = entityManager.getCriteriaBuilder();

CriteriaQuery<MyEntity> cq = cb
        .createQuery(MyEntityclass);

// initialize predicates here

return entityManager.createQuery(cq).getResultList().size();

这不可能是正确的方式。

有解决方案吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-05-22 01:58:16

类型为MyEntity的查询将返回MyEntity。您想要查询一个Long

代码语言:javascript
复制
CriteriaBuilder qb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> cq = qb.createQuery(Long.class);
cq.select(qb.count(cq.from(MyEntity.class)));
cq.where(/*your stuff*/);
return entityManager.createQuery(cq).getSingleResult();

显然,您将希望使用在示例中跳过的任何限制和分组等构建表达式。

票数 244
EN

Stack Overflow用户

发布于 2012-05-12 02:51:37

我已经使用cb.createQuery() (不带result类型参数)解决了这个问题:

代码语言:javascript
复制
public class Blah() {

    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
    CriteriaQuery query = criteriaBuilder.createQuery();
    Root<Entity> root;
    Predicate whereClause;
    EntityManager entityManager;
    Class<Entity> domainClass;

    ... Methods to create where clause ...

    public Blah(EntityManager entityManager, Class<Entity> domainClass) {
        this.entityManager = entityManager;
        this.domainClass = domainClass;
        criteriaBuilder = entityManager.getCriteriaBuilder();
        query = criteriaBuilder.createQuery();
        whereClause = criteriaBuilder.equal(criteriaBuilder.literal(1), 1);
        root = query.from(domainClass);
    }

    public CriteriaQuery<Entity> getQuery() {
        query.select(root);
        query.where(whereClause);
        return query;
    }

    public CriteriaQuery<Long> getQueryForCount() {
        query.select(criteriaBuilder.count(root));
        query.where(whereClause);
        return query;
    }

    public List<Entity> list() {
        TypedQuery<Entity> q = this.entityManager.createQuery(this.getQuery());
        return q.getResultList();
    }

    public Long count() {
        TypedQuery<Long> q = this.entityManager.createQuery(this.getQueryForCount());
        return q.getSingleResult();
    }
}

希望它能有所帮助:)

票数 34
EN

Stack Overflow用户

发布于 2010-05-22 01:56:46

代码语言:javascript
复制
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(cq.from(MyEntity.class)));

return em.createQuery(cq).getSingleResult();
票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2883887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档