2016-04-14 131 views
0

我有兩個實體具有以下字段:Combinate 2 HQL查詢

Application: applicationId, name, description, lastVersion (transient) 

ApplicationVersion: applicationVersionId, application, versionName, creationDate 

我試圖讓所有的應用程序的集合,並且,與一個或應用程序更多版本,請將ApplicationVersion的versionName與最新的creationDate放在瞬態字段lastVersion中。

在這等一下我有兩個HQL查詢,這樣做:

這一個讓所有無版本的應用程序:

SELECT a from Application a where a not in (select b.application from ApplicationVersion b) 

這得到那些版本的最後一個版本:

select b from ApplicationVersion b where b.creationDate = (select max(bb.creationDate) from ApplicationVersion bb where bb.application = b.application) 

執行這兩個操作後,我遍歷第二個結果集,並將這些應用程序及其最後的外部版本添加到第一個版本。

但我想combinate在這樣的兩個查詢(這是不工作):

select new foo.bar.Application(a.applicationId, a.name, a.description, b.version) from Application a, ApplicationVersion b where 
(a not in (select bb.application from ApplicationVersion bb)) 
or 
(a=b.application and b.creationDate = (select max(bb.creationDate) from ApplicationVersion bb where bb.application = b.application)) 

有沒有(有效的)的方式來combinate查詢和執行只有一個,而避免做迭代編程?

回答

0

是的,你可以變得更好,當你的孩子記錄有一個家長,你必須使用

join fetch 

例如,你有應用程序,ApplicationVersion,則:

from ApplicationVersion av 
join fetch av.application ap 
where ap.applicationId = :id 

通過這種方式,您可以在兩個對象之間建立關係,並且可以使用where表達式進行過濾,請確保您的ApplicationVersion具有引用Application對象的屬性。

希望它對你有幫助。