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. Вы очень тяжело боретесь с фреймворком, а не пользуетесь его гибкостью