2010-01-12 63 views
4

有沒有在子查詢中使用SetMaxResult()的方法?我正在寫一個查詢來返回屬於最近訂單的所有訂單商品。所以我需要限制子查詢中的記錄數量。在子查詢中使用NHibernate HQL SELECT TOP

SELECT i.* 
FROM tbl_Orders o 
JOIN tbl_OrderItems i on i.OrderId = o.Id 
WHERE 
o.Id in (SELECT TOP 1 o.Id FROM tbl_Orders o orderby o.Date desc) 

進出口使用HQL特別是因爲標準API犯規讓你的項目另一個域對象(訂單林查詢,但要返回訂單項目)

我知道:像

等價的SQL看起來該hql不接受「SELECT TOP」,但如果我使用SetMaxResult()它將應用於外部查詢,而不是子查詢。

任何想法?

+0

NHibernate的3相關:http://stackoverflow.com/questions/7133983/using-a-subquery-for-a-column-with-queryover/ – 2011-08-22 09:27:01

回答

3

只需查詢訂單(並使用SetMaxResult)並執行「提取連接」以確保所選訂單的所有訂購項都立即加載。 在返回的訂單上,您可以訪問訂單項,而不會導致發送到數據庫的新SQL語句。

+0

我相信這個方法應該如果您願意,也可以使用標準API。 – 2010-01-12 11:34:00

+0

我試圖避免這條路線,因爲爲了簡潔起見,我還省略了另外一個WHERE子句。 那麼你是說它不可能對子查詢應用限制嗎? – Andy 2010-01-12 11:38:59

+0

我不認爲有可能對子查詢有限制,對不起。 我擔心你會需要兩個查詢(一個選擇你想要的n個訂單的id,然後是另一個訂單行,其中orderId在返回的id列表中)。 但取決於您想要的頂級訂單的訂單行總數,我可能會在代碼中執行更多操作(即獲取前n個訂單的所有訂單行,然後在代碼中篩選以選擇您想要的訂單行)。 – 2010-01-12 11:59:46

1

我遇到了這個問題了,但是並沒有發現使用HQL解決方案...

子查詢與頂部將是非常好的,因爲這是更快然後做第一個完整的加盟。首先完成加入時,SQL Server首先加入表格,然後對所有行進行排序,然後選擇前30。通過子選擇,一張桌子的前30列被取出,然後與另一張桌子結合。這要快得多!

我對Subselect的查詢需要大約1秒,加入和排序需要15秒!所以加入不是一種選擇。

我結束了兩個查詢,第一子選擇:

IQuery q1 = session.CreateQuery("select id from table1 order by id desc"); 
q1.SetMaxResults(100); 

然後第二查詢

IQuery q2 = session.CreateQuery("select colone, coltwo from table2 where table1id in (:subselect)"); 
q2.SetParameterList("subselect", q1.List()); 
1

從NHibernate的3.2,你可以在HQL在查詢的末尾使用SKIP n/TAKE n。 您查詢的是:

SELECT i.* 
FROM tbl_Orders o 
JOIN tbl_OrderItems i on i.OrderId = o.Id 
WHERE 
o.Id in (SELECT o.Id FROM tbl_Orders o orderby o.Date desc take 1)