2012-06-28 52 views
0

我有以下查詢,我需要轉換爲NHibernate的:需要轉換的是選擇多個值的NHibernate的查詢(標準或HQL)子查詢

SELECT o.* 
FROM orders o 
INNER JOIN 
(
     -- get the most recent orders based on end_date (this implies the same order can exist in the orders table more than once) 
     SELECT o2.order_id, MAX(o2.end_date) AS max_end_date 
     FROM orders o2 
     GROUP BY o2.order_id 
) most_recent_orders 
       ON o.order_id=most_recent_orders.order_id 
       AND o.end_date=most_recent_orders.max_end_date 
-- of the most recent orders, get the ones that are complete     
WHERE o.is_complete=1 

我知道HQL不支持加入到子查詢這就是爲什麼這不起作用。我不能使用「in」語句,因爲子查詢選擇了2個值。我試着使用建議Hibernate文檔:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-tuple

from Cat as cat 
where not (cat.name, cat.color) in (
    select cat.name, cat.color from DomesticCat cat 
) 

但這拋出一個錯誤,因爲SQL Server不喜歡多個值在「in」語句。

任何幫助,將不勝感激!我接受使用Criteria或Hql的解決方案。

回答

0

這是使用子查詢來達到同樣的

var maxDateQuery = DetachedCriteria.For<Order>() 
    .Add(Restrictions.PropertyEq("OrderId", "order.OrderId")) 
    .SetProjection(Projections.Property("EndDate")); 

var results = session.CreateCriteria<Order>("order") 
    .Add(Subqueries.Eq("EndDate",maxDateQuery)) 
    .Add(Restrictions.Eq("IsComplete", true)) 
    .List<Order>(); 
+0

哪裏是「order.OrderId」是從哪裏來的?我在查詢中的任何地方都沒有看到名爲「order」的別名? –

+0

對,我忘記了。已編輯 – Firo

+0

現在它引發異常,因爲它將「order.OrderId」作爲字符串文字處理,而不是對其進行插值。錯誤:NHibernate.QueryException:在NHibernate.Criterion.SimpleExpression類型不匹配:Id預期類型System.Guid,實際類型System.String –