3

2 つのエンティティ A と B の間に多対 1 の関係がマッピングされています。Fruit と Color を使用してシナリオをシミュレートします。

すべての果物が 1 つの色しかないと仮定します。したがって、Fruit クラスに Color プロパティがあり、Fruit のマッピング コードには次のようなものがあります。

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にはすべてが含まれますがFruitsinnerResultには次のもののみが含まれます。Color

編集: マッピング内に適用される特定のソリューション

デフォルトの左結合は変更できません: Nhibernate の Inner または Right Outer Join および Many to Many コレクションの Fluent Nhibernateです。しかし、他のNHibernate機能を使用するのはどうですか:

Fruitが存在する場合にのみ意味があるとしましょう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 に変更しませんが、少なくともマッピングではカラフルな果物のみを許可します...

于 2012-11-27T08:07:03.617 に答える