如何在HQL中使用ROW_NUMBER()?

时间:2011-04-05 09:42:45

标签: nhibernate hql row-number

我的数据库是MS SQL。我想在HQL中使用ROW_NUMBER()。可能吗?怎么样?我知道 关于Custom Functions。但更喜欢不需要修改web.config的方法。

更新

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

3 个答案:

答案 0 :(得分:1)

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

编辑: 我试验了自己,在ExecuteUpdate()的sql生成中忽略了SetMaxResults和SetFirstResult,所以这不起作用。

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

答案 1 :(得分:0)

我会使用普通的SQL。主要是因为“我不喜欢将所有这些加载到内存中”。这不是一个非常面向对象的任务,因此您不需要ORM。

注意:纯SQL意味着会话缓存被破坏。只要你不在同一(非无状态)会话中做其他事情,你就不会遇到任何麻烦。如果你这样做,我会选择OO方式并实际将项目加载到内存中。

答案 2 :(得分:0)

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

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