我需要像下面这样转换一个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(甚至是Hibernate JPA 2)具有如此巨大的差异,尤其是在条件查询中。
我开始
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));
但是不知道如何在这里实现投影,也没有别名
这是一个老问题,但让我们举个例子:
使用CriteriaBuilderHibernate,与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);
另一方面,如果要查询实际的“金额”值,则可以执行以下操作:
CompoundSelection<Integer> projection = cb.construct(Integer.class, cb.sum(isr.get("amount"))); cq.where(..).select(projection); List<Integer> amounts = em.createQuery(cq).getResultList();