2017-10-16 116 views
0

我一直試圖讓Hibernate在其where子句中爲子查詢生成一個查詢。我有used this answer as a base to help me going,但這個問題只提到一個表。在WHERE子句和多個連接中使用子查詢進行Hibernate查詢

然而,這正是我需要(在SQL):而在內部約束導航

SELECT [...] 
FROM a 
LEFT OUTER JOIN b on a.idb = b.idb 
LEFT OUTER JOIN c on b.idc = c.idc 
[...] 
LEFT OUTER JOIN k out on j.idk = k.idk 
WHERE k.date = (SELECT max(date) from k in where in.idk = out.idk) OR k.date is null 

因爲我不是很習慣使用Hibernate,我無法確定這些內部連接。 我能夠重新創建鏈接的答案中的初始標準,但我似乎無法加入標準和rootCriteria。

回答

0

如果實體與@ManyToOne註釋正確連接,則只需將條件連接到上一個表就足以將條件傳播到整個查詢。

下面的代碼似乎正常工作,以添加我正在尋找的WHERE子句。

DetachedCriteria kSubquery = DetachedCriteria.forClass(TableJPE.class,"j2"); 
kSubQuery = kSubQuery.createAlias("k","k2"); 
kSubQuery.setProjection(Projections.max("k2.date")); 
kSubQuery = kSubQuery.add(Restrictions.eqProperty("j.id", "j2.id")); 
rootCriteria.add(Restrictions.disjunction() 
    .add(Subqueries.propertyEq("k.date",kSubQuery)) 
    .add(Restrictions.isNull("k.date")));