我有一个项目,我们只使用命名查询来访问数据库。最近我们创建了新的实体,我们计划按照每个子类模式映射一下,所以我们创建了文档之后的映射,一切看起来都很好,除了我们找不到如何在命名查询中定义表别名以便加载每个子类。
这是我们到目前为止所做的:
实体:
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_.
的方式设置别名的正确方法
任何帮助?
答案 0 :(得分: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>
但当然你可能只使用了HQL而不是SQL:
<query name="myhqlquery">
from Gear
</query>
然而......我必须说这是对NHibernate的一种非常低效的使用。你正在非常努力地反对这个框架,而不是利用它的灵活性。