HQL – 分页的行标识符

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

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

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

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

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

这是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(); 

hibernate会将此转换为数据库根据其sql方言理解的模式。 在oracle上它将使用ROWNUM

据我所知,用“纯”hql实现这一点是不可能的。

使用查询接口分页:

分页的Query接口有两种方法。

1.查询setFirstResult(int startPosition):此方法采用一个整数,表示结果集中的第一行,从第0行开始。

2.查询setMaxResults(int maxResult):此方法告诉Hibernate检索固定数量的maxResults对象。 将上述两种方法结合使用,我们可以在Web或Swing应用程序中构建一个分页组件。

例:

 Query query = session.createQuery("FROM Employee"); query.setFirstResult(5); query.setMaxResults(10); List list = query.list(); for(Employee emp: list) { System.out.println(emp); } 

使用Criteria接口进行分页:分区的Criteria接口有两种方法。

1.标准setFirstResult(int firstResult):

设置要检索的第一个结果。

2.列表项标准setMaxResults(int maxResults):

对要检索的对象数量设置限制。

例:

 Criteria criteria = session.createCriteria(Employee.class); criteria.setFirstResult(5); criteria.setMaxResults(10); List list = criteria.list(); for(Employee emp: list) { System.out.println(emp); } 

好吧,你原则上可以从HSQL访问ROWNUM / ROWID(虽然我从未使用它)。 参见例如Ron的博客 。 这应该工作。

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