如何在HQL中使用ROW_NUMBER()函数?

3
我的数据库是MS SQL。我想在HQL中使用ROW_NUMBER()。这个可能吗?如何实现?我知道关于自定义函数的内容。但我希望有一种不需要修改web.config的方法。
更新: 我的最终目标是使用HQL删除表/实体中除了最后n条记录之外的所有记录。我不想将它们全部加载到内存中再进行删除。

1
你打算做什么?总有https://dev59.com/MkvSa4cB1Zd3GeqPbx0_#2034389,但我们需要知道你的需求。 - rebelliard
@binaryhowl:请查看我的更新。 - Afshar Mohebi
这听起来像是一个奇怪的目标 - 这只是一次性的吗?HQL 真的必要吗,还是可以使用普通的 SQL(使用 Session.CreateSqlQuery)? - cbp
3个回答

1
自从NH v2以来,通过IQuery.ExecuteUpdate() HQL支持delete和update语句。您可以尝试使用IQuery.SetMaxResults()IQuery.SetFirstResult()(它们使用ROW_NUMBER())来获得所需的效果。
编辑: 我亲自尝试过,对于ExecuteUpdate(),SetMaxResults和SetFirstResult在SQL生成时被忽略,因此这不起作用。
此外,在下面的评论中,HQL ExecuteUpdate(至少对于DELETE)并不一定意味着内存加载对象状态。

1
这将需要将对象加载到内存中。 - Stefan Steinegger
1
你错了!HQL被翻译成SQL并直接在数据库中执行! - Jaguar
是的,没错,但是据我所知,在那里你没有SetMaxResults可用。要使用SetMaxResults,你需要将它们加载到内存中。这就是我实际上的意思,如果我表达不清楚,对不起。 - Stefan Steinegger

0

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

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()。谢谢。 - Afshar Mohebi

0

我会使用普通的SQL来完成这个任务。主要是因为“我不喜欢将它们全部加载到内存中”。这不是一个非常面向对象的任务,所以你不需要ORM。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接