NHibernate Именованный запрос с таблицей подкласса

У меня есть проект, где мы используем только именованные запросы для доступа к базе данных. Недавно мы создали новые сущности, которые планировали отобразить в соответствии с таблицей в соответствии с шаблоном подкласса, поэтому мы создали сопоставления в соответствии с документацией, и все выглядит хорошо, за исключением того, что мы не можем найти способ определения псевдонимов таблицы в именованных запросах, чтобы загрузить каждый подкласс.

Это то, что мы сделали до сих пор:

Объекты:

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>

И это приводит к следующему SQL, сгенерированному nhibernate:

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_.

Любая помощь?

1 ответ

Это сработало для меня:

<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>

Но, конечно, вы могли бы просто использовать HQL вместо SQL:

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

Однако... Я должен сказать, что это очень неэффективное использование NHibernate. Вы очень тяжело боретесь с фреймворком, а не пользуетесь его гибкостью

Другие вопросы по тегам