2012-06-12 59 views
2

我有一個項目,我們只使用命名查詢來訪問數據庫。最近我們創建了一些新的實體,我們計劃按照每個子類的模式映射表,所以我們在文檔之後創建了映射,並且一切似乎都很好,除了我們無法找到如何在命名查詢中定義表別名以便加載每個子類。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> 

,這導致由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_.

方式的正確方法

有什麼幫助嗎?

+1

是否有任何理由使用SQL而不是HQL? –

回答

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的。您正在爲框架而努力,而不是利用其靈活性。

+0

對不起,你能解釋爲什麼這是違背框架的?我使用SQL,因爲它似乎是調整SQL查詢以獲得最佳性能的最佳方式,同時保留了框架的所有靈活性:) – Drevak

+0

在需要時手工製作SQL **絕​​對是不錯的**。但是強制每個查詢都是浪費時間。而且,在這種情況下,您需要付出很多努力才能使用所有其他方法開箱即用(並且在很多情況下它可能會中斷)。換句話說:你會在這裏完全優化什麼?你的**實際分析**顯示那些優化是必要的嗎? –

+0

使用ORM背後的想法恰恰不是手工製作SQL,而是利用ORM提供的更改跟蹤,標識映射和其他功能。 SQL查詢功能提供了靈活性,因爲*有時*您有不易用HQL,LINQ或Criteria表達的查詢。但大多數時候其他方法更容易編碼和維護。 –