3

我在两个实体 A 和 B 之间映射了多对一关系。我将使用 Fruit 和 Color 来模拟我的场景:

假设所有的水果只有一种颜色。所以我的 Fruit 类和我的 Fruit 映射代码中有一个 Color 属性:

ManyToOne(f=>f.Color, mapper=>mapper.Column("ColorId"));

生成的 SQL 如下:

Select f0_.Name, f0...From Fruit f0_
  left outer join Color c0_
  on f0_.ColorId = c0_.id

我想知道是否有任何方法可以强制内部联接而不是外部联接。因为从商业角度来看,没有颜色的水果并不是真正的水果,不应该存在。

4

1 回答 1

2

使用Criteria API,我们可以同时实现left和/或inner加入:

剩下

// default left outer join
var leftResult = session.CreateCriteria<Fruit>()
  .SetFetchMode("Color", NHibernate.FetchMode.Join)
  .List<Fruit>();

// explicit inner join
var innerResult = session.CreateCriteria<Fruit>()
  .CreateCriteria("Color", NHibernate.SqlCommand.JoinType.InnerJoin)
  .List<Fruit>();

leftResult将包含所有Fruits,而innerResult将仅包含这些具有Color

编辑:映射内部应用的特定解决方案

好吧,默认的左连接无法更改:Nhibernate 中的 Inner 或 Right Outer Join 和 Many to Many 集合上的 Fluent Nhibernate。但是如何使用其他 NHibernate 功能:

假设我们的Fruit, 只有在存在 时才有意义Color如果这是真的,并且如果没有选择颜色(将列设置为 NULL) ,我们将永远不需要这些表记录,ColorId那么有一种方法可以调整映射:

// Mapping Fruit
Table("Fruits");
Where("colorId IS NOT NULL");
...

或在 XML

  <class name="Fruit" table="Fruits" where="colorId IS NOT NULL" ... >

(见http://nhibernate.info/doc/nh/en/index.html#mapping-declaration-class

所以这个,不会改变 LEFT 到 INNER,但至少映射将允许只有五颜六色的水果......

于 2012-11-27T08:07:03.617 回答