1

これは実際のスキーマの単純化された例ですので、ご容赦ください。と列を持つテーブルfooがありidますvaluebarテーブルに戻る FK を持つテーブルもありfoo、このテーブルにはextended_value列があります。Foo のクラス マップを残して Bar に参加させ、存在する場合はその列を使用しようとしextended_value、そうでない場合は Foo にフォールバックしvalueます。

必要なものに相当するSQLは次のとおりです。

select coalesce(b.extended_value, f.value) as value
  from foo f
  left join bar b on (b.id = f.id)

NHibernate の上で Fluent を使用しています。これは私が使用しようとしてきたものです:

Join("bar", m =>
{
    m.Optional();
    m.KeyColumn("id");
    m.Map(foo => foo.Value).Formula("COALESCE(extended_value, value)");
});

extended_valueしかし、生成された SQL はとの両方valueが同じテーブルにあることを想定しているため、これは失敗しています。

何か案は?

4

2 に答える 2

3

私のアドバイスは、マッピングでこれを行わないことです。

マップfoo.valueしてbar.extended_value独立してから、coalesceクエリで使用したり、??演算子を使用するマップされていないプロパティを作成したりします。

于 2012-10-16T18:50:58.483 に答える
1

私はDiego Mijelshonのアドバイスを使用しますが、以下もうまくいくはずです

// FooMap
Map(foo => foo.Value).Formula("COALESCE((select b.extended_value from bar b WHERE b.id = id), value)");
于 2012-10-25T08:52:17.790 に答える