2

名前付きクエリのみを使用してデータベースにアクセスするプロジェクトがあります。最近、サブクラス パターンごとにテーブルに従ってマッピングする予定の新しいエンティティを作成したので、ドキュメントに従ってマッピングを作成しました。各サブクラスをロードします。

これまでに行ったことは次のとおりです。

エンティティ:

public class Gear 
{
    public virtual string Name { get; set; }

    public virtual string Slug { get; set; }
}

public class Pedal : Gear
{
    public virtual PedalTypeEnum PedalType { get; set; }
}

マッピング:

public class GearMap : ClassMap<Gear>
{
    public GearMap()
    {
        Table("[Gear]");

        Id(m => m.Id).Column("Id");
        Map(m => m.Name).Column("[Name]");
        Map(m => m.Slug).Column("[Slug]");
    }
}


public class PedalMap : SubclassMap<Pedal>
{

    public PedalMap() 
    {

        Table("[Pedal]");
        KeyColumn("[Gear_Id]");

        Map(m => m.PedalType).Column("PedalType").CustomType(typeof(PedalTypeEnum));


    }
}

実行しようとしているクエリは次のとおりです。

<sql-query name="myquery" >
<return alias="[Gear]" class="Gear" />
<![CDATA[
    SELECT 
        {[Gear].*},
FROM 
        [Gear] {[Gear]}
]]>
</sql-query>

これにより、nhibernate によって次の SQL が生成されます。

SELECT 
     [Gear].[Id] as column1_12_0_, 
     [Gear].[Name] as column3_12_0_, 
     [Gear].[Slug] as column4_12_0_,          
     [Gear]_1_.PedalType as PedalType13_0_, 
     case 
        when [Gear]_1_.[Gear_Id] is not null then 1 
        when [Gear].[Id] is not null then 0 end as clazz_0_
FROM 
        [Gear] [Gear] 

ご覧のとおり、サブクラスを正しく検出し、サブクラスにのみ属するフィールド PedalType をロードしようとしますが、エイリアスを持つテーブルがないため[Gear]_1_.、クエリは失敗します...

ペダルテーブルとの結合を試みましたが、エイリアスを次のように変換する正しい方法を見つけることができません。[Gear]_1_.

何か助けはありますか?

4

1 に答える 1

4

これは私のために働いた:

<sql-query name="myquery" >
  <return alias="Gear" class="Gear" />
  SELECT {Gear.*}
  FROM Gear {Gear}
  LEFT JOIN Pedal Gear_1_ on Gear.Id = Gear_1_.Gear_Id
</sql-query>

ただし、もちろん、SQLの代わりにHQLを使用することもできます。

<query name="myhqlquery">
  from Gear
</query>

しかし...これはNHibernateの非常に非効率的な使用法であると言わなければなりません。フレームワークの柔軟性を利用するのではなく、フレームワークと非常に激しく戦っています。

于 2012-06-17T23:52:22.767 に答える