【问题标题】:Inner or Right Outer Join in Nhibernate and Fluent Nhibernate on Many to Many collection多对多集合中的 Nhibernate 和 Fluent Nhibernate 的内连接或右外连接
【发布时间】:2010-06-16 21:26:13
【问题描述】:

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

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

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

【问题讨论】:

  • 这有意义吗?您要求获取与根实体没有任何联系的实体集合
  • @Jaguar:是的,因为我有一个过滤器应用于连接元素的案例。但是,因为连接表是查询中的主表,所以当我 LEFT 连接时,我得到的行数比我想要的实际过滤实体多,被过滤掉的实体在所有列中都只有 NULL。

标签: nhibernate fluent-nhibernate nhibernate-mapping


【解决方案1】:

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

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

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

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

【讨论】:

  • 这基本上是我实现的解决方案。我允许查询返回未过滤的整个集合,并在应用程序端手动执行过滤。不是很优雅,因为在某些情况下会通过网络传输大量额外数据,但绝对是最简单的解决方案,无需打开 NH 源并将其摇摆成我想要的。
  • 这就是我建议从属性调用 HQL 的原因。过滤将在数据库中完成。您不需要对 NH 做任何特别的事情,只需从未映射的属性中运行查询即可。根据您的数据集,减少的数据传输量可能很大。
【解决方案2】:

您可以使用 NHibernate 的 HQL 语法来生成一个类似于 SQL 的查询,但使用了 NHibernate 的映射能力。 HQL 支持right outer join(或简称right join)。以下页面是 NHibernate 的 HQL 查询语言的良好参考:

【讨论】:

  • 我需要在从数据库中检索任何内容时发生这种情况。不仅仅是特定的查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多