NHibernate左连接

时间:2016-08-19 15:07:00

标签: c# nhibernate

一个非常初学的问题:

我有两个课程,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; }
}

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

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

2 个答案:

答案 0 :(得分: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; }
}

然后在映射中你应该引用句子作为参考。 但你没有说你使用哪种映射(流利,顺从等)

答案 1 :(得分:0)

修复了hbm.xml文件中的映射,并使用以下方法获得了所需的结果:

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