NHibernate左连接选择计数在一对多关系中

Posted

技术标签:

【中文标题】NHibernate左连接选择计数在一对多关系中【英文标题】:NHibernate left join select count in one-to-many relationship 【发布时间】:2011-01-28 17:39:48 【问题描述】:

我一直在寻找一个正确的合成器后一周没有成功。

我有 2 节课:

public class ArtworkData

      public virtual Guid Id  get; set; 
      public virtual string Name  get; set;     
      public virtual IList<CommentData> Comments  get; set; 

public class CommentData

      public virtual Guid Id  get; set; 
      public virtual string Text  get; set; 
      public virtual ProfileData Profile  get; set; 
      public virtual ArtworkData Artwork  get; set; 
      public virtual DateTime Created  get; set; 

我想做这个查询:

    SELECT   this_.ArtworkId          as ArtworkId3_3_,
         this_.Name               as Name3_3_,
         this_.Description        as Descript3_3_3_,
    FROM     Artwork this_
         LEFT outer JOIN 
   (SELECT c.ArtworkIdFk, count(1) Cnt
   FROM Comment c
   GROUP BY c.ArtworkIdFk) as com
   on com.ArtworkIdFk = this_.ArtworkId
    ORDER BY 1 desc

但我找不到路。 此刻我只有这样的东西:

ICriteria c = this.Session.CreateCriteria(typeof(ArtworkData));
if(filter.Category !=null)

      c.CreateAlias("Categories", "cat")
       .Add(Restrictions.Eq("cat.Id", filter.Category.Id));

DetachedCriteria crit = DetachedCriteria.For(typeof(CommentData), "comment")
                    .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Count("comment.Id").As("cnt"))    
                .Add(Projections.GroupProperty("comment.Artwork.Id")));                    



c.Add(Expression.Gt(Projections.SubQuery(crit), 0));
   c.AddOrder(Order.Desc(Projections.SubQuery(crit)));

但这不是我想要的。 我想通过 cmets 的数量获得所有艺术品订单(但我不需要获得这个数字)。 请帮我!我要疯了!

【问题讨论】:

请编辑问题,而不是添加多个不是答案的答案。 (我合并了您的帐户 - 现在您应该再次拥有此帐户的所有权) 【参考方案1】:

我不明白你想用这个奇怪的 SQL 做什么,但如果你需要获取所有带有 cmets 数量的艺术品,你可以试试这个查询:

<query name="ArtworkWithCommentsCount">
   SELECT artwork.Name, artwork.Comments.size
   FROM Artwork artwork
</query>

【讨论】:

这并不意味着您不能在 *.hbm.xml 文件中定义命名查询 我不知道如何得到这个结果并与其他标准合并。这容易吗? 很简单 - fluent nhibernate named-query without using hbm file for the map【参考方案2】:

如果您使用 NHibernate 3,您可以使用以下代码:

var artworks = Session.Query<Artwork>().OrderBy(a => Comments.Count);

或者你可以使用 HQL:

Session.CreateQuery("from Artwork a order by size(a.Comments)")

【讨论】:

var 艺术品 = Session.QueryOver().OrderBy(art => art.Comments.Count).Desc;创建查询后,如何使用它?【参考方案3】:

尝试分离标准。看看这个blogpost。

【讨论】:

谢谢 gor,但我不知道我可以对子查询使用哪个限制。我不能在这个例子中使用 Greater than like... 我可以吗? 这是一个投影。您可以不受限制地使用Criteria 我已经有了这个:DetachedCriteria crit = DetachedCriteria.For(typeof(CommentData), "comment") .SetProjection(Projections.ProjectionList() .Add(Projections.Count("comment.Id") .As("cnt")) .Add(Projections.GroupProperty("comment.Artwork.Id")));现在我想将它添加到主要标准中,但我不知道如何......

以上是关于NHibernate左连接选择计数在一对多关系中的主要内容,如果未能解决你的问题,请参考以下文章

Nhibernate:如何用一对多关系表示多对多关系?

NHibernate 不会删除一对多关系中的孤儿

Nhibernate一对多关系复合键问题

单向一对多关系的流畅 NHibernate 配置 - 删除问题

NHibernate之(12):初探延迟加载机制

NHibernate:一对多