NHibernate 命名查询,每个子类都有表

标签 nhibernate named-query table-per-subclass

我有一个项目,我们仅使用命名查询来访问数据库。最近,我们创建了新实体,计划按照每个子类模式的表进行映射,因此我们按照文档创建了映射,一切看起来都很好,除了我们找不到如何在命名查询中定义表别名以便加载每个子类。

这是我们迄今为止所做的:

实体:

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

有什么帮助吗?

最佳答案

这对我有用:

<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 的一种非常低效的使用方式。您正在与框架进行艰苦的斗争,而不是利用它的灵活性。

关于NHibernate 命名查询,每个子类都有表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10995613/

相关文章:

fluent-nhibernate - Fluent NHibernate 自动映射类约定并未应用于整个类层次结构

NHibernate QueryOver 投影 - 将集合投影到 DTO

hibernate - 使用 @NamedQuery 进行单列选择(J2EE/JPA、Hibernate)是一个好习惯吗?

java - 使用 hibernate 命名查询和 spring 填充 DTO 的 List 属性

nhibernate - 关联引用未映射 - 每个子类策略由表映射的对象集合

c# - 使用 Moq 模拟 NHibernate ISession

Nhibernate 查询以选择按行分组的计数

nhibernate 动态插入因某些空组件属性而失败

java - 带有参数名和值的分组依据的 JPA 命名查询