2011-02-13 60 views
3

我可以做映射到這樣的查詢:的領域之一是COUNT(*)NHibernate的

select id,name,address,(select count(*) from account where record_id=id) as counter 
from data where id = :id 

目前,我使用的是本地SQL。

class person 
{ 
    public virtual long Id{get;set;} 
    public virtual string Name{get;set;} 
    public virtual string Address{get;set;} 
    public virtual long Counter{get;set;} 
} 

映射:

<property name="Counter" formula="(select count(*) from account where record_id=id)"  type="long"/> 
+0

好吧,現在我明白你想要使用的類。我調整了我的答案,請看看。 – 2011-02-14 07:46:44

回答

5

是的,你應該使用formula

你的映射可能是這樣的:

<property name="CountOfAccounts" 
    formula="(select count(*) from account where account.id = id)"/> 
+0

謝謝。但現在我有一個「對象引用未設置爲對象的實例」 – Lampa 2011-02-13 16:18:15

3

這取決於你想使用的業務類。你可以有這些課程;

class Person 
{ 
    int Id { get; private set; } 
    string Name { get; set; } 
    string Address { get; set; } 
    IList<Account> Accounts { get; private set; } 
} 

class Account 
{ 
    // ... 
} 

然後,您將它映射爲「正常」爲一對多。不要忘記利用延遲加載。你可以使它成爲雙向的。

您可以創建這樣可防止加載帳戶的優化的查詢只算來:

select 
    p, 
    size(p.Accounts) 
from 
    Person p 
where 
    p.id = :id 

這將產生非常類似的查詢,然後你的。您在第一列中獲得一個人,在第二列中獲得賬戶數量。