2009-04-11 34 views
1

我執行標記在一個特定的實體,SQL Server 2008的我現在已經是,簡化,這樣的結構在使用NHibernate:獲取SQL Server上使用HQL標籤和標籤數2008

public class Entity { 
    public Guid Id { get; set; } 
} 

public class Tag { 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
} 

public class TagAssoc { 
    public Tag LinkedTag { get; set; } 
    public Entity LinkedEntity { get; set; } 
    //User 
    //Other properties 
} 

沒有什麼奇特的東西:一個實體可以使用相同的標籤多次標記,因爲該關聯還包括標記實體和其他內容的用戶數據。

現在,我正在嘗試獲取特定實體的標籤列表,以及標籤已應用了多少次的計數。事情是這樣的HQL:

select tass.LinkedTag, count(tass.LinkedTag) 
from TagAssoc as tass left outer join tass.LinkedTag as t 
group by tass.LinkedTag 

這將生成以下SQL查詢:

select tag1_.Id as Id0_, tag1_.Name as Name0_, tag1_.Id as x0_0_, count_big(tag1_.Id) as x1_0_ 
from BandTags tagassoc0_ left outer join Tags tag1_ on tagassoc0_.TagId=tag1_.Id 
group by tag1_.Id 

這看起來是正確的,但不會在SQL Server 2008中工作,因爲不包括標籤的名稱屬性在「group by」子句中。爲了使它工作,我必須手動by子句爲了調整該集團包括標籤類的所有屬性:

select tass.LinkedTag, count(tass.LinkedTag) 
from TagAssoc as tass left outer join tass.LinkedTag as t 
group by tass.LinkedTag.Id, tass.LinkedTag.Name 

但這取決於標籤類的屬性,因此必須更新一次課堂改變的時間。 有沒有其他方法可以使第一個HQL查詢工作?也許一些自動使「group by」屬性顯式的HQL語法?

感謝

回答

1

它不會出現,有什麼辦法,使NHibernate的自動確定由屬性的組。該文件甚至似乎是他們給了聚合函數的例子HQL暗示這一點:

選擇貓,通過cat.Id數從Eg.Cat貓組(元素(cat.Kittens)) ,貓。重量,...

在那裏,他們還明確指定貓的屬性。

如果您想在每次類更改時動態構建一個不需要更新的查詢,我認爲您遇到了Reflection和Criteria接口。

ProjectionList list = Projections.ProjectionList(); 
foreach (PropertyInfo prop in typeof(Tag).GetProperties()) 
{ 
    list.Add(Projections.GroupProperty(prop.Name)); 
} 
list.Add(Projections.Property("LinkedTag")); 
list.Add(Projections.Count("LinkedTag")); 

session.CreateCriteria(typeof(TagAssoc)).SetProjection(list).List(); 

我沒有試過這個,所以它可能會或可能不會工作,或者可能需要一些調整,但你明白了。你可能會認爲Tag類不會變得足夠值錢。

+0

我沒有想過通過反射來完成它。但現在我想我會堅持手動聲明每個屬性。 感謝您的回答。 :) – LorenzCK 2009-04-22 12:08:42