gpt4 book ai didi

Nhibernate force inner join 多对一关系

转载 作者:行者123 更新时间:2023-12-03 09:48:50 25 4
gpt4 key购买 nike

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

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

最佳答案

使用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 将包含所有 FruitsinnerResult 将仅包含具有 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,但至少映射将允许只有五颜六色的水果......

关于Nhibernate force inner join 多对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13571775/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com