我有两个具有以下字段的实体:
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))
是否有任何(有效的)方法来组合两个查询并只执行一个查询,并避免以编程方式进行迭代?
答案 0 :(得分:0)
是的,你可以做得更好,当你的孩子记录有父母时,你必须使用
join fetch
例如,您有Application,ApplicationVersion,然后:
from ApplicationVersion av
join fetch av.application ap
where ap.applicationId = :id
通过这种方式,您可以在两个对象之间建立关系,并且可以使用where表达式进行过滤,请确保您的ApplicationVersion具有引用Application对象的属性。
希望对你有所帮助。