使用DetachedCriteria在nHibernate中进行复杂查询

时间:2009-02-13 12:14:55

标签: c# .net nhibernate

我目前正试图从手工制作的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)

2 个答案:

答案 0 :(得分:3)

如果后者更难编写,我无法看到从hql迁移到DetachedCriteria的优势。并阅读。

在我的项目中,我最好使用DetachedCriteria,除非语法太复杂。然后我用hql。直到它再次变得复杂。然后我在sql中尝试一下,如果它没有提高可读性,那就回到hql。

请注意,您将来必须维护这些查询。

答案 1 :(得分:0)

HQL在内部完成了很多字符串操作,因此可能会因为字符串是不可变类型而产生内存问题。建议使用DetachedCriteria而不是HQL。