2009-01-23 59 views
1

我有一個一對多的關係。我想構建這樣的查詢:如何構造這個NHibernate查詢

給我的一切,都只有一個孩子,這個孩子child.Type = X

因爲我是學習,請出示與標準API查詢父母並與HQL。謝謝。

而順便說一下,有沒有什麼自動的方法來知道什麼HQL與標準表達式相同?

更新:

看來我發現如何做到這一點的HQL:

@"select Parent 
    from Parent parent 
     join parent.Children ch 
     where (ch.Type = :chType) and 
       (select count(*) from parent.Children) = 1") 

但它是做得很好?表現如何?我有直覺認爲計數(*)放置不正確...

+0

我想你會得到更好的迴應,如果你發佈你的映射文件,代碼類和一些示例數據。 – 2009-01-23 19:22:16

回答

1

同意@David Pellerin關於該問題的含糊性。然而,我字面上只是把午餐'n'Learn關於這個話題,所以使用典型的客戶,訂單關係。 。 。

標準API:

public IList<Customer> GetCustomersWithOrdersAfterDate(DateTime sinceDate) 
{ 
    return Session.ICriteria.CreateCriteria(typeof(Customer)) 
     .CreateCriteria("Orders") 
     .Add(Expression.Gt("OrderDate", sinceDate)) 
     .List<Customer>(); 
} 

HQL(這看起來像噸SQL,只有你不必瞭解整個關係圖):

public IList<Customer> GetCustomersWithOrdersAfterDate(DateTime sinceDate) 
{ 
    Session.CreateQuery("select c from Customer c, c.Orders.elements o WHERE o.OrderDate > :orderDate).SetDateTime("orderDate", sinceDate).List<Customer>(); 
} 

BTW:
如果您只是在學習,停止你正在做的一切,並去看these screencasts。可能是我見過的有關nHibernate的最佳視頻集。極力推薦。

解決您的「有計數= 1」要求的另一個有用鏈接是here。相當複雜,但我已經適應了類似的一些成功。

+0

謝謝。我的問題是理論上的,這就是爲什麼我沒有例子。我知道標準api的基本要素,但您不會告訴我我要求的主要內容:在您的示例中,我希望獲得只有一個訂單的客戶。 – 2009-01-23 20:25:48