2011-04-05 108 views
3

我的數據庫是MS SQL。我想在HQL中使用ROW_NUMBER()。可能嗎?怎麼樣?我知道 約Custom Functions。但更喜歡一種不需要修改web.config的方式。如何在HQL中使用ROW_NUMBER()?

UPDATE:

我的最終目標是要刪除的表/實體的所有記錄,除了比HQL最後N條記錄。我不喜歡將它們全部加載到內存中然後刪除它們。

+1

你有什麼計劃呢?總是有http://stackoverflow.com/questions/1998560/row-number-and-nhibernate-finding-an-items-page/2034389#2034389,但我們需要知道你的需求。 – rebelliard 2011-04-05 12:12:49

+0

@binaryhowl:請seee我的更新。 – 2011-04-06 05:11:26

+0

這聽起來像一個奇怪的目標 - 這是一次嗎? HQL是否真的必要,或者你可以使用純SQL(使用Session.CreateSqlQuery)? – cbp 2011-04-06 05:15:41

回答

0

我會爲此使用普通的SQL。主要是因爲「我不喜歡將所有內容加載到內存中」。這不是一個非常面向對象的任務,所以你不需要ORM。

注意:純SQL意味着會話緩存被破壞。只要你不在同一個(非無狀態)會話中做其他事情,你就不會遇到任何麻煩。如果你這樣做,我會選擇OO的方式,並實際加載到內存中的項目。

1

截至NH v2,HQL支持通過IQuery.ExecuteUpdate()刪除和更新語句。您也可以使用IQuery.SetMaxResults()IQuery.SetFirstResult()(使用ROW_NUMBER())來獲得所需的效果。

編輯: 我試驗了我自己,SetMaxResults和SetFirstResult在ExecuteUpdate()的sql生成過程中被忽略,所以這是行不通的。

另外@下面的註釋,HQL ExecuteUpdate(至少對於DELETE)並不一定意味着對象狀態的內存中負載。

+1

這需要將對象加載到內存中。 – 2011-04-06 09:02:33

+1

你錯了! hql被轉換爲sql並直接執行到db! – Jaguar 2011-04-06 12:57:31

+0

是的,的確如此,但據我所知,您沒有SetMaxResults可用。要使用SetMaxResults,您需要將它們存入內存。這就是我的意思,對不起,如果我不清楚。 – 2011-04-07 10:28:53

0

我會用HQL的ExecuteUpdateDesc排序,類似的組合:

delete Person p1 
where p1.Id in 
      (select p2.Id 
      from Person p2 
      where rownum <= 10 
      order by p2.Id desc) 
+0

'rownum'不適合我。順便說一句,我使用了SQL和'ROW_NUMBER()'。謝謝。 – 2011-04-06 11:35:54