有没有人知道HQL是否有关键字来识别ROWID或ROWNUM等行?
我想用HQL实现分页,但我无法使用.setMaxResult()或.setFirstResult(),因为我不直接使用会话对象,因此不使用Query对象而只是创建我的查询作为字符串并使用.find()方法。
我在我的查询中尝试使用LIMIT和OFFSET,但是HQL似乎忽略了这些关键字并且无论如何都将整个结果返回给我。
我也无法使用Hibernate标准,因为它不支持我的查询中出现的“HAVING”子句。
我的最后一招是使用ROWNUM / ROWID关键字限制结果集。还有其他人有其他建议吗?
答案 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,我至少会重新考虑我的架构决策。我知道这些变化总是很难,但它可能是值得的。