【问题标题】:NHibernate Left JoinNHibernate 左连接
【发布时间】:2016-08-19 15:07:00
【问题描述】:

一个非常初级的问题:

我有两个类,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 的外键。一篇评论可以有很多句子(Review:ReviewSentences is 1:Many)

我已经尝试了很长时间,但无法使用 session.CreateCriteria 复制以下关于 NHibernate 的查询:

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

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

【问题讨论】:

  • ORM 不需要引用,您应该在加载父实体时在实体之间使用 relations 来加载子实体。寻找 JOIN 意味着映射有问题
  • 感谢@PanagiotisKanavos 的指导。现在问题解决了

标签: c# nhibernate


【解决方案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; }
}

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-03-06
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多