2009-10-26 63 views
1

我有兩個實體,它們分別表示Customer和Order,它們獨立存在並且沒有在映射文件中定義的關係。Nhibernate表之間的ICreteria關係

現在我想NHibernate的給我下面的查詢結果:

select customer.id,customer.name from customer,order 
where customer.id = order.id 
and order.status = "Open" 

我試圖用投影,但檢查輸出SQL我看到NHibernate的時候產生一個子查詢這不是我的本意(和性能較差嗎?)

public IList<Customer> GetOpenOrders() 
{ 
        DetachedCriteria orders = DetachedCriteria.For<Order>("orders") 
        .SetProjection(Projections.Property("orders.id")); 

        ICriteria cret = session.CreateCriteria(typeof(Customer)) 
        .Add(Subqueries.PropertyIn("id", orders)) 
        .Add(Expression.Eq("Status", "open")); 

        return cret.List<Customer>(); 
} 

是否有可能使用標準來做到這一點,或者有沒有更好的方法來完成這種查詢?

回答

1

我不知道,如果你可以用的ICriteria API做,因爲的ICriteria查詢針對特定對象創建的,但你應該能夠HQL做到這一點:

select customer 
from Customer customer, Orders order 
where customer.id = order.id and order.status = 'Open' 
1

一個更好的方式是將客戶和訂單映射關聯起來。

  1. 客戶類具有作爲屬性的訂單集合。
  2. 訂單類有一個客戶作爲財產。
  3. 兩個

這是在映射多一點的工作,但它會少寫的查詢和使用客戶和訂單對象的代碼工作。

1

如果您的客戶有訂單採集,那麼你可以使用這個:

ICriteria cret = session.CreateCriteria(typeof(Customer)) 
        .CreateCriteria("orders") 
          .Add(Expression.Eq("Status", "open"));