我目前正试图从手工制作的hql转移到通过DetachedCriteria构建的查询。我有和HQL:
from GenericObject genericObject
left join fetch genericObject.Positions positions
where (positions.Key.TrackedSourceID, positions.Key.PositionTimestamp) in
(select gp.Key.TrackedSourceID, max(gp.Key.PositionTimestamp)
from GenericPosition gp
group by gp.Key.TrackedSourceID)
现在使用DetachedCriteria:
var subquery = DetachedCriteria
.For (typeof (GenericPosition), "gp")
.SetProjection (Projections.ProjectionList ()
.Add (Projections.Property ("gp.Key.TrackedSourceID"))
.Add (Projections.Max ("gp.Key.PositionTimestamp"))
.Add (Projections.GroupProperty ("gp.Key.TrackedSourceID"))
);
var criteriaQuery = DetachedCriteria
.For (typeof (GenericObject), "genericObject")
.CreateAlias ("genericObject.Positions", "positions")
.SetFetchMode ("genericObject.Positions", FetchMode.Eager)
.Add (Subqueries.In (??, subquery))
我不知道输入什么而不是??创建表达式(positions.Key.TrackedSourceID,positions.Key.PositionTimestamp)
答案 0 :(得分:3)
如果后者更难编写,我无法看到从hql迁移到DetachedCriteria的优势。并阅读。
在我的项目中,我最好使用DetachedCriteria,除非语法太复杂。然后我用hql。直到它再次变得复杂。然后我在sql中尝试一下,如果它没有提高可读性,那就回到hql。
请注意,您将来必须维护这些查询。
答案 1 :(得分:0)
HQL在内部完成了很多字符串操作,因此可能会因为字符串是不可变类型而产生内存问题。建议使用DetachedCriteria而不是HQL。