组合两个HQL查询

时间:2016-04-14 15:38:06

标签: java hibernate hql

我有两个具有以下字段的实体:

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

ApplicationVersion: applicationVersionId, application, versionName, creationDate

我正在尝试使用所有应用程序获取一个Collection,并且对于具有一个或多个版本的应用程序,将具有最新creationDate的ApplicationVersion的versionName放在瞬态字段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)

执行两者后,我迭代第二个结果集,并将这些应用程序及其最后一个eversion添加到第一个结果集。

但我想在这样的事情中组合两个查询(这根本不起作用):

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))

是否有任何(有效的)方法来组合两个查询并只执行一个查询,并避免以编程方式进行迭代?

1 个答案:

答案 0 :(得分:0)

是的,你可以做得更好,当你的孩子记录有父母时,你必须使用

join fetch 

例如,您有Application,ApplicationVersion,然后:

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

通过这种方式,您可以在两个对象之间建立关系,并且可以使用where表达式进行过滤,请确保您的ApplicationVersion具有引用Application对象的属性。

希望对你有所帮助。