我的数据库是 MS SQL。我想ROW_NUMBER()
在 HQL 中使用。可能吗?如何?我知道Custom Functions
。但更喜欢一种不需要修改web.config的方式。
更新:
我的最终目标是删除表/实体中的所有记录,除了 HQL 的最后 n 条记录。我不喜欢将它们全部加载到内存中然后删除它们。
我的数据库是 MS SQL。我想ROW_NUMBER()
在 HQL 中使用。可能吗?如何?我知道Custom Functions
。但更喜欢一种不需要修改web.config的方式。
更新:
我的最终目标是删除表/实体中的所有记录,除了 HQL 的最后 n 条记录。我不喜欢将它们全部加载到内存中然后删除它们。
从 NH v2 开始,HQL 支持通过IQuery.ExecuteUpdate()
. 您也可以尝试使用IQuery.SetMaxResults()
and IQuery.SetFirstResult()
(使用ROW_NUMBER()
)来获得所需的效果。
编辑:我对自己进行了试验,在 ExecuteUpdate() 的 sql 生成中忽略了 SetMaxResults 和 SetFirstResult,因此这将不起作用。
同样@下面的评论,HQL ExecuteUpdate(至少对于DELETE)并不一定意味着对象状态的内存加载。
I would use plain SQL for this. Mainly because of "I don't like to load all of them in memory". This is not a very object oriented task, so you don't need an ORM.
Note: plain SQL means that the session cache gets broken. You don't get any troubles as long as you don't do other stuff within the same (non-stateless) session. If you do, I would choose the OO way and actually load the items into memory.
我会使用 HQLExecuteUpdate
和Desc
排序的组合,类似于:
delete Person p1
where p1.Id in
(select p2.Id
from Person p2
where rownum <= 10
order by p2.Id desc)