次のような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));
ただし、ここでプロジェクションを実装する方法もエイリアスもわかりません
これは古い質問ですが、例を挙げましょう。
CriteriaBuilder
を使用すると、Hibernateとは異なり、常に 結果のタイプ クエリを実行してから、プロジェクションを作成します。
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();