2010-04-06 18 views
1

採取這種簡單的例子NHibernate的,我可以提高我的映射或查詢

一位工作人員類,它引用了員工類

public class Staff 
{ 
    public Staff() 
    { 
     Team = new List<Staff>(); 
    } 

    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Staff> Team { get; set; } 
    public virtual Staff Manager { get; set; } 
} 

流暢映射的其他實例

public class StaffMap : ClassMap<Staff> 
{ 
    public StaffMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References(x => x.Manager).Column("ManagerId"); 
     HasMany(x => x.Team).KeyColumn("ManagerId").Inverse(); 
    } 
} 

現在我想要運行一個查詢,該查詢將加載所有員工並熱切加載經理和團隊成員。這是我想出了

IList<Staff> resutls = 
    session.CreateCriteria<Staff>() 
    .SetFetchMode("Team", FetchMode.Eager) 
    .SetResultTransformer(Transformers.DistinctRootEntity) 
    .List<Staff>(); 

但是SQL(我想要做什麼)的重複列,2 team2_.ManagerId和2 team2_.Id

SELECT 
this_.Id as Id0_1_, 
this_.Name as Name0_1_, 
this_.ManagerId as ManagerId0_1_, 
team2_.ManagerId as ManagerId3_, 
team2_.Id as Id3_, 
team2_.Id as Id0_0_, 
team2_.Name as Name0_0_, 
team2_.ManagerId as ManagerId0_0_ 
FROM [SelfRef].[dbo].[Staff] 
this_ left outer join 
[SelfRef].[dbo].[Staff] team2_ 
on this_.Id=team2_.ManagerId 

的問題是,這應該是發生了什麼?

我在查詢或地圖中做了什麼錯誤嗎?

或者它是HHib即時通訊使用(這是版本2.1.0.4000)的功能?

非常感謝提前

回答

1

是的,這是正常的,因爲你使用它兩次作爲外鍵。它將通過您的DBMS進行優化。我通常忽略生成查詢的SELECT部分​​,因爲它們對性能沒有影響。