我在将HQL转换为Criteria查询时遇到了一些问题。作为规范的一部分,我需要Criteria查询的返回值为Criteria类型,这可能不会更改。
这是我完全正常工作的HQL查询:
select sum(m.frequent / case when m.vigilants.size > 1 then m.vigilants.size
else 1 end) from Museum m inner join m.vigilants v where size(m.vigilants) > 1
and v.forename = 'Mike Jones' or size(m.vigilants) = 1 and v.forename='Mike Jones'
这是我到目前为止尝试获得标准查询
Criteria criteria = session.createCriteria(Museum.class, "m");
criteria.createAlias("m.vigilants", "v");
criteria.setProjection(Projections.distinct(Projections.property("m.id")));
criteria.add(Restrictions.or(Restrictions.sizeGt("vigilants", 1), Restrictions.eq("v.forename", "Mike Jones")));
说实话,我真的很困难,并且一直在努力让这个工作起来,我不知道如何将这个HQL转换为Criteria查询!
答案 0 :(得分:0)
在我完全正确之前,我通常不得不摆弄这些东西一段时间,但这是第一步让你开始。
此外,整个size > 1 or size == 1
事情归结为size >= 1
,如果您正在进行内部联接,那么这是隐含的,所以我只是把它留了出来。
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Number> query = builder.createQuery(Long.class);
Root<Museum> root = query.from(Museum.class);
Join<Museum, Vigilant> vigilantsJoin = root.join("vigilants");
Predicate forenameIsMikeJones = builder.equal(vigilantsJoin.get("forename"), "Mike Joines");
Expression<Integer> numVigilants= builder.size(root.get("vigilants"));
Expression<Number> freqOverNumVigilants = builder.quot(root.get("frequent"), numVigilants);
Expression<Sum> sumOfFreqOverNumVigilants = builder.sum(freqOverNumVigilants);
query.select(sumOfFreqOverNumVigilants).where(forenameIsMikeJones);
TypedQuery<Number> typedQuery = entityManager.createQuery(query);