NHibernate Left Join

本文关键字:Join Left NHibernate | 更新日期: 2023-09-27 18:03:04

一个非常初学者的问题:

我有两个类,复习和复习句子:

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; }
}

属性 reviewsentence。reviewId是指向Review.recordId的外键。一篇复习可以有多个句子(复习:reviewsentence is 1: many)

我已经尝试了很长一段时间,但无法复制以下查询在NHibernate与会话方面。CreateCriteria:

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

查询给出了Review表中没有reviewsentence表中任何记录的所有评论。

NHibernate Left Join

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

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; }
}

那么在映射中你应该引用句子作为引用。但是你没有说你使用的是哪种映射(Fluent, conformist等)

修复了hbm.xml文件中的映射,并使用

获得了所需的结果:
var reviews= session.CreateCriteria<Review>("r")
                .CreateCriteria("r.sentences", JoinType.LeftOuterJoin)
                .Add(Restrictions.IsNull("recordId"))
                .List<Review>();