HQL - 分页的行标识符

时间:2009-01-28 21:04:16

标签: java hibernate pagination hql

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

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

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

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

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

3 个答案:

答案 0 :(得分: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();

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

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

答案 1 :(得分:2)

使用查询界面进行分页:

查询界面有两种分页方法。

<强> 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<Employee> list = query.list();
for(Employee emp: list) {            
   System.out.println(emp);
}

使用Criteria Interface分页: 分页的Criteria接口有两种方法。

<强> 1。标准setFirstResult(int firstResult):

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

<强> 2。列表项标准setMaxResults(int maxResults):

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

示例:

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

答案 2 :(得分:1)

好吧,你原则上可以从HSQL访问ROWNUM / ROWID(虽然我从未使用它)。参见例如Ron's Weblog。这应该有用。

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