内部或右外部加入Nhibernate和Fluent Nhibernate on Many to Many系列

时间:2010-06-16 21:26:14

标签: nhibernate fluent-nhibernate nhibernate-mapping

如何强制NHibernate在多对多集合中执行RIGHT外连接或INNER连接而不是LEFT外连接?

我想要这样做的原因是因为过滤应用于集合元素。使用左连接,您将获得与未过滤查询相同的行数,但过滤掉的元素只显示所有字段的NULL。但是,使用右连接时,将从查询中返回正确的行数和元素数。

我希望可以在集合的映射中的某处指定连接..

2 个答案:

答案 0 :(得分:5)

我认为在集合映射中指定右连接或内连接是不可能的。 fetch子句的唯一选项是默认的左外连接和顺序选择。

问题在于,当您创建映射时,NHibernate需要知道如何从连接的左侧获取任意根项的集合元素。使用右连接或内连接时,根对象可能不存在于返回的集合中,因此您在此处陷入困境。

如果过滤条件是静态的,则可以在映射中指定where子句。我认为这将是适合您情况的推荐解决方案。

解决方法是在对象中使集合成为私有,然后创建另一个调用HQL查询的属性来实现内部联接并返回该集合。这个返回的集合将具有您想要的语义,但是您需要使用单独的方法来添加或删除集合中的项目。

答案 1 :(得分:1)

您可以使用NHibernate的HQL语法生成一个让人想起SQL的查询,但使用NHibernate的映射功能。 HQL支持right outer join(或简称right join)。以下页面是NHibernate的HQL查询语言的很好的参考: