这是一个老问题,但让我们举个例子:
使用
CriteriaBuilderHibernate,与Hibernate不同,您总是从要查询 的结果类型 开始,然后构造投影。
CriteriaBuilder cb = em.getCriteriaBuilder();//We want Integer resultCriteriaQuery<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 dayJoin<Islem,WorkingDay> join = isr.join("workingDay",JoinType.INNER);//Create the sum expressionexpression<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);另一方面,如果要查询实际的“金额”值,则可以执行以下操作:
CompoundSelection<Integer> projection = cb.construct(Integer.class, cb.sum(isr.get("amount")));cq.where(..).select(projection);List<Integer> amounts = em.createQuery(cq).getResultList();


