我在两个实体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
我想知道是否有任何方式强制内连接而不是外连接。因为从商业角度来看,没有颜色的水果不是真正的水果,不应该存在。
答案 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,但至少这个映射只允许有丰富多彩的水果......