Hibernate 在JPA2中使用投影

Hibernate 在JPA2中使用投影,hibernate,jpa-2.0,projection,criteria-api,hibernate-criteria,Hibernate,Jpa 2.0,Projection,Criteria Api,Hibernate Criteria,我需要转换一个Hibernate条件查询,如下所示 curList = session.createCriteria(Islem.class) .createAlias("workingDay", "d") .setProjection(Projections.sum("amount")) .add(Restrictions.eq("currency", CURRENCY))

我需要转换一个Hibernate条件查询,如下所示

curList = session.createCriteria(Islem.class)
                    .createAlias("workingDay", "d")
                    .setProjection(Projections.sum("amount"))
                    .add(Restrictions.eq("currency", CURRENCY))
                    .add(Restrictions.eq("product", product))
                    .add(Restrictions.ne("status", INACTIVE))
                    .add(Restrictions.eq("d.status", ACTIVE))
                    .getResultList();
然而,在JPA(2)中,我不知道如何实现预测——在本例中——总和。奇怪的是,Hibernate和JPA(甚至HibernateJPA2)有如此巨大的差异,特别是在标准查询中

我从

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Islem> cq = cb.createQuery(Islem.class);
Root<Islem> isr = cq.from(Islem.class);
cq.select(isr).where(cb.equal(isr.get("currency"), CURRENCY), 
                     cb.notEqual(isr.get("status"), INACTIVE),
                     cb.equal(isr.get("product"), product));
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Islem.class);
根isr=cq.from(Islem.class);
cq.select(isr).其中(cb.equal(isr.get(“货币”)),currency),
cb.notEqual(isr.get(“状态”),不活动,
cb.equal(isr.get(“产品”)、product);

但是,我不知道如何在这里实现投影,别名也不知道这是一个老问题,但让我们举一个例子:

与Hibernate不同,使用
CriteriaBuilder
,您总是从要查询的结果类型开始,然后构建投影

CriteriaBuilder cb = em.getCriteriaBuilder();
//We want Integer result
CriteriaQuery<Integer> cq = cb.createQuery(Integer.class);

//The root does not need to match the type of the result of the query!
Root<Islem> isr = cq.from(Islem.class);

//Create a join to access the variable status of working day
Join<Islem,WorkingDay> join = isr.join("workingDay",JoinType.INNER);

//Create the sum expression
Expression<Integer> sum = cb.sum(isr.get("amount"));

cq.where(
         cb.equal(isr.get("currency"), CURRENCY),
         cb.notEqual(isr.get("status"), INACTIVE),
         cb.equal(isr.get("product"), product),
         cb.equal(join.get("status"), ACTIVE)
).select(sum);
CriteriaBuilder cb=em.getCriteriaBuilder();
//我们想要整数结果
CriteriaQuery cq=cb.createQuery(Integer.class);
//根不需要与查询结果的类型匹配!
根isr=cq.from(Islem.class);
//创建联接以访问工作日的可变状态
Join-Join=isr.Join(“工作日”,JoinType.INNER);
//创建求和表达式
表达式sum=cb.sum(isr.get(“金额”);
哪里(
cb.equal(isr.get(“货币”)、货币),
cb.notEqual(isr.get(“状态”),不活动,
cb.equal(isr.get(“产品”)、产品),
cb.equal(join.get(“状态”),活动)
).选择(总和);
另一方面,如果要查询实际的“金额”值,可以执行以下操作:

CompoundSelection<Integer> projection = cb.construct(Integer.class, cb.sum(isr.get("amount")));

cq.where(..).select(projection);

List<Integer> amounts = em.createQuery(cq).getResultList();
CompoundSelection projection=cb.construct(Integer.class,cb.sum(isr.get(“amount”));
cq.其中(..)。选择(投影);
列表金额=em.createQuery(cq).getResultList();