我的數據庫是MS SQL。我想在HQL中使用ROW_NUMBER()
。可能嗎?怎麼樣?我知道 約Custom Functions
。但更喜歡一種不需要修改web.config的方式。如何在HQL中使用ROW_NUMBER()?
UPDATE:
我的最終目標是要刪除的表/實體的所有記錄,除了比HQL最後N條記錄。我不喜歡將它們全部加載到內存中然後刪除它們。
我的數據庫是MS SQL。我想在HQL中使用ROW_NUMBER()
。可能嗎?怎麼樣?我知道 約Custom Functions
。但更喜歡一種不需要修改web.config的方式。如何在HQL中使用ROW_NUMBER()?
UPDATE:
我的最終目標是要刪除的表/實體的所有記錄,除了比HQL最後N條記錄。我不喜歡將它們全部加載到內存中然後刪除它們。
我會爲此使用普通的SQL。主要是因爲「我不喜歡將所有內容加載到內存中」。這不是一個非常面向對象的任務,所以你不需要ORM。
注意:純SQL意味着會話緩存被破壞。只要你不在同一個(非無狀態)會話中做其他事情,你就不會遇到任何麻煩。如果你這樣做,我會選擇OO的方式,並實際加載到內存中的項目。
截至NH v2,HQL支持通過IQuery.ExecuteUpdate()
刪除和更新語句。您也可以使用IQuery.SetMaxResults()
和IQuery.SetFirstResult()
(使用ROW_NUMBER()
)來獲得所需的效果。
編輯: 我試驗了我自己,SetMaxResults和SetFirstResult在ExecuteUpdate()的sql生成過程中被忽略,所以這是行不通的。
另外@下面的註釋,HQL ExecuteUpdate(至少對於DELETE)並不一定意味着對象狀態的內存中負載。
這需要將對象加載到內存中。 – 2011-04-06 09:02:33
你錯了! hql被轉換爲sql並直接執行到db! – Jaguar 2011-04-06 12:57:31
是的,的確如此,但據我所知,您沒有SetMaxResults可用。要使用SetMaxResults,您需要將它們存入內存。這就是我的意思,對不起,如果我不清楚。 – 2011-04-07 10:28:53
我會用HQL的ExecuteUpdate
和Desc
排序,類似的組合:
delete Person p1
where p1.Id in
(select p2.Id
from Person p2
where rownum <= 10
order by p2.Id desc)
'rownum'不適合我。順便說一句,我使用了SQL和'ROW_NUMBER()'。謝謝。 – 2011-04-06 11:35:54
你有什麼計劃呢?總是有http://stackoverflow.com/questions/1998560/row-number-and-nhibernate-finding-an-items-page/2034389#2034389,但我們需要知道你的需求。 – rebelliard 2011-04-05 12:12:49
@binaryhowl:請seee我的更新。 – 2011-04-06 05:11:26
這聽起來像一個奇怪的目標 - 這是一次嗎? HQL是否真的必要,或者你可以使用純SQL(使用Session.CreateSqlQuery)? – cbp 2011-04-06 05:15:41