Nhibernate强制内部联接在多对一关系上

时间:2012-11-26 19:31:53

标签: nhibernate

我在两个实体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

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

1 个答案:

答案 0 :(得分:2)

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

LEFT

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

INNER

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

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

编辑:在映射中应用的特定解决方案

嗯,默认的左连接无法更改:Inner or Right Outer Join in Nhibernate and Fluent Nhibernate on Many to Many collection。但是如何使用其他NHibernate功能:

如果有Fruit,我们的Color只是有意义的。如果这是真的,并且我们将不需要这些表记录而不选择 Color (将列ColorId设置为NULL),有一种方法可以调整映射:

// 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,但至少这个映射只允许有丰富多彩的水果......