2009-02-13 21 views
2

我目前正在尝试从手工制作的hql转移到通过DetachedCriteria构建的查询。我有和HQL:在nHibernate中使用DetachedCriteria的复杂查询

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)

回答

3

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

在我的项目中,我最好使用DetachedCriteria,除非语法太复杂。然后我使用hql。直到它再次变得复杂。然后我试着用sql,如果不提高可读性,则返回hql。请注意,您将不得不在未来维护这些查询。

+1

嗯,你是对的。但是,我正在动态创建此查询,并调用方法将某些内容附加到查询中。查询结束后,我需要为参数添加值,而且它非常不雅 - DetachedCriteria在这里看起来更好。 – paszczi 2009-02-13 12:28:06

+0

你是对的,我希望你的问题会有答案,...我发现自己在类似的情况... – 2010-02-26 07:46:48

0

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