8

有谁知道 HQL 是否有一个关键字来识别诸如 ROWID 或 ROWNUM 之类的行?

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

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

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

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

4

3 回答 3

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 是不可能实现这一点的。

于 2009-05-08T14:38:52.943 回答
2

使用查询接口进行分页:

Query接口有两种分页方法。

1. Query 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 接口进行分页:Criteria 接口 有两种方法进行分页。

1. 条件 setFirstResult(int firstResult):

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

2.列表项Criteria 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);
}
于 2014-05-16T14:40:37.333 回答
1

Well, you can in principle access ROWNUM/ROWID from HSQL (though I've never used it). See e.g. Ron's Weblog. That should work.

But I'd like to point out that you're really working against Hibernate and HSQL if you do it like that. The proper way is to use setMaxResult() & friends. If you cannot do that b/c of your architecture, I'd at least reconsider my architectural decisions. I know these are always tough changes to make, but it might be worth it.

于 2009-01-29T11:42:50.257 回答