3

我的数据库是 MS SQL。我想ROW_NUMBER()在 HQL 中使用。可能吗?如何?我知道Custom Functions。但更喜欢一种不需要修改web.config的方式。

更新:

我的最终目标是删除表/实体中的所有记录,除了 HQL 的最后 n 条记录。我不喜欢将它们全部加载到内存中然后删除它们。

4

3 回答 3

1

从 NH v2 开始,HQL 支持通过IQuery.ExecuteUpdate(). 您也可以尝试使用IQuery.SetMaxResults()and IQuery.SetFirstResult()(使用ROW_NUMBER())来获得所需的效果。

编辑:我对自己进行了试验,在 ExecuteUpdate() 的 sql 生成中忽略了 SetMaxResults 和 SetFirstResult,因此这将不起作用。

同样@下面的评论,HQL ExecuteUpdate(至少对于DELETE)并不一定意味着对象状态的内存加载。

于 2011-04-06T07:44:13.233 回答
0

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.

于 2011-04-06T08:41:16.083 回答
0

我会使用 HQLExecuteUpdateDesc排序的组合,类似于:

delete Person p1 
where p1.Id in 
            (select p2.Id 
             from Person p2 
             where rownum <= 10
             order by p2.Id desc)
于 2011-04-06T09:28:44.097 回答