HQL - 分页的行标识符

use*_*701 8 java pagination hibernate hql

有谁知道HQL是否有关键字来识别ROWID或ROWNUM等行?

我想用HQL实现分页,但是我无法使用.setMaxResult()或.setFirstResult(),因为我不直接使用会话对象,因此不使用Query对象而只是创建我的查询一个字符串并使用.find()方法.

我在我的查询中尝试使用LIMIT和OFFSET,但是HQL似乎忽略了这些关键字并且无论如何都将整个结果返回给我.

我也无法使用Hibernate标准,因为它不支持我的查询中出现的"HAVING"子句.

我的最后一种方法是使用ROWNUM/ROWID关键字限制结果集.还有其他人有其他建议吗?

And*_*son 18

这是hibernate闪耀的一种情况:

hql查询的典型解决方案.

int elementsPerBlock = 10;
int page = 2;

return  getSession().createQuery("from SomeItems order by id asc")
            .setFirstResult(elementsPerBlock * (page-1) + 1 )
            .setMaxResults(elementsPerBlock)
            .list();
Run Code Online (Sandbox Code Playgroud)

hibernate会将其转换为数据库根据其sql方言理解的模式.在oracle上它将使用ROWNUM <X创建一个子选择.在postgresql上它将在msSQL服务器上发出LIMIT/OFFSET它将发出一个TOP ..

据我所知,用"纯"hql实现这一点是不可能的.


sle*_*ske 1

嗯,原则上你可以从 HSQL 访问 ROWNUM/ROWID(尽管我从未使用过它)。请参阅Ron 的博客。那应该有效。

但我想指出,如果你这样做的话,你实际上是在对抗 Hibernate 和 HSQL。正确的方法是使用 setMaxResult() 和朋友。如果你不能做到架构的 b/c,我至少会重新考虑我的架构决策。我知道做出这些改变总是很艰难,但可能是值得的。