2015-04-25 41 views
0

我在將HQL轉換爲標準查詢時遇到了一些問題。作爲規範的一部分,我需要Criteria查詢的返回值是Criteria類型,這可能不會改變。HQL到標準轉換問題

這是我的全部工作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

在我得到完全正確的信息之前,我通常不得不擺弄這些東西一段時間,但是這裏是第一次開始。

另外,整個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);