2016-08-19 61 views
0

一个很初级的问题:NHibernate的左连接

我有两个班,审查和ReviewSentences:

public class Review 
{ 
    public virtual int recordId { get; set; } 
    public virtual string reviewerId { get; set; } 
    public virtual string reviewerName { get; set; } 
    public virtual string country { get; set; } 
    public virtual string zipCode { get; set; } 
    public virtual string reviewProduct { get; set; } 
    public virtual string reviewText { get; set; } 
    public virtual string reviewTextLanguage { get; set; } 
    public virtual double sentimentScore { get; set; } 
    public virtual bool isScoreRefined { get; set; } 
} 

pulic class ReviewSentences 
{ 
    public virtual int recordId { get; set; } 
    public virtual int reviewId { get; set; } 
    public virtual int sentenceId { get; set; } 
    public virtual string sentence { get; set; } 
    public virtual double sentimentScore { get; set; } 
} 

ReviewSentences.reviewId该物业是一个外键指Review.recordId。一个回顾可以有很多句子(评论:ReviewSentences为1:许多)

我一直在努力了很长时间,但现在无法与session.CreateCriteria复制下面的查询NHibernate的方面:

select * from Reviews r 
left join 
ReviewSentences rs 
on 
r.RecordId = rs.ReviewId 
where rs.ReviewId is null 

该查询向我提供了Review表中没有任何记录的ReviewSentences表中的所有评论。

+0

奥姆斯不需要引用,每当你加载一个父实体时,你应该在实体之间使用*关系*来加载子实体。寻找一个JOIN意味着有一个映射问题 –

+0

感谢给@PanagiotisKanavos方向。现在解决问题 – Syed

回答

1

这是一个映射问题,您应该在Review类中包含ReviewSentences数组并正确映射它。

public class Review 
{ 
    public virtual int recordId { get; set; } 
    public virtual string reviewerId { get; set; } 
    public virtual string reviewerName { get; set; } 
    public virtual string country { get; set; } 
    public virtual string zipCode { get; set; } 
    public virtual string reviewProduct { get; set; } 
    public virtual string reviewText { get; set; } 
    public virtual string reviewTextLanguage { get; set; } 
    public virtual double sentimentScore { get; set; } 
    public virtual bool isScoreRefined { get; set; } 
    public virtual IList<ReviewSentences> sentences { get; set; } 
} 

pulic class ReviewSentences 
{ 
    public virtual int recordId { get; set; } 
    public virtual int reviewId { get; set; } 
    public virtual int sentenceId { get; set; } 
    public virtual string sentence { get; set; } 
    public virtual double sentimentScore { get; set; } 
} 

然后映射你应该参考句子作为参考。 但你没有说哪一种映射您使用(流利,墨守成规等)的

+0

感谢您为我的问题提供指导。这加上答案在这里帮助我达到我想要的:http://stackoverflow.com/questions/29985158/minimal-and-correct-way-to-map-one-to-many-with-nhibernate – Syed

0

固定在hbm.xml文件中的映射,并获得所需结果使用:

var reviews= session.CreateCriteria<Review>("r") 
       .CreateCriteria("r.sentences", JoinType.LeftOuterJoin) 
       .Add(Restrictions.IsNull("recordId")) 
       .List<Review>();