Nhibernate 如何在HQL中使用ROW_NUMBER()?

Nhibernate 如何在HQL中使用ROW_NUMBER()?,nhibernate,hql,row-number,Nhibernate,Hql,Row Number,我的数据库是MS SQL。我想在HQL中使用行号。可能吗?怎样我知道 关于但更喜欢不需要修改web.config的方式 更新: 我的最终目标是使用HQL删除表/实体中除最后n条记录之外的所有记录。我不希望在内存中加载所有语句,然后删除它们。从NH v2开始,HQL支持通过IQuery.ExecuteUpdate删除和更新语句。您还可以使用IQuery.SetMaxResults和IQuery.SetFirstResult进行实验,它们使用行数来获得所需的效果 编辑: 我自己做了一个实验,SetM

我的数据库是MS SQL。我想在HQL中使用行号。可能吗?怎样我知道 关于但更喜欢不需要修改web.config的方式

更新:


我的最终目标是使用HQL删除表/实体中除最后n条记录之外的所有记录。我不希望在内存中加载所有语句,然后删除它们。

从NH v2开始,HQL支持通过IQuery.ExecuteUpdate删除和更新语句。您还可以使用IQuery.SetMaxResults和IQuery.SetFirstResult进行实验,它们使用行数来获得所需的效果

编辑: 我自己做了一个实验,SetMaxResults和SetFirstResult在为ExecuteUpdate生成sql时被忽略,所以这不起作用


此外,在下面的注释中,HQL ExecuteUpdate和至少对于DELETE,并不一定意味着内存中加载了对象状态。

我将使用纯SQL进行此操作。主要是因为我不喜欢把它们都放在内存中。这不是一个非常面向对象的任务,所以您不需要ORM


注意:纯SQL意味着会话缓存被破坏。只要不在同一个非无状态会话中执行其他操作,就不会遇到任何问题。如果您这样做,我将选择OO方式并实际将项目加载到内存中。

我将使用HQL的ExecuteUpdate和Desc排序的组合,类似于:

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

你打算做什么?总是有,但我们需要知道你的需要。@binaryhowl:请查看我的更新。这听起来像是一个奇怪的目标-这是一次性的吗?HQL真的有必要吗?或者您可以使用Session.CreateSqlQuery使用普通SQL吗?这需要将对象加载到内存中。您错了!hql被转换为sql并直接执行到db!是的,那是真的,但据我所知,你没有可用的SetMaxResults。要使用SetMaxResults,您需要将它们放入内存中。这就是我真正的意思,如果我不清楚的话,很抱歉。rownum不为我工作。顺便说一下,我使用了SQL和行数。谢谢