你如何做HQL限制查询?

在Hibernate 3中,是否有办法在HQL中完成以下MySQL限制的等价物?

select * from a_table order by a_table_column desc limit 0, 20; 

如果可能,我不想使用setMaxResults。 这在Hibernate / HQL的旧版本中是绝对可能的,但似乎已经消失了。

这是几年前在Hibernate论坛上发布的 ,当被问及为什么在Hibernate 2中工作,而不是在Hibernate 3中:

限制从来不是 HQL中支持的子句。 你打算使用setMaxResults()。

因此,如果它在Hibernate 2中起作用,似乎是巧合,而不是devise。 我认为这是因为Hibernate 2 HQLparsing器会replace它被识别为HQL的查询的位,并保持原样,所以你可以潜入一些本地SQL。 然而,Hibernate 3有一个合适的AST HQLparsing器,而且它的宽容度要低得多。

我认为Query.setMaxResults()真的是你唯一的select。

  // SQL: SELECT * FROM table LIMIT start, maxRows; Query q = session.createQuery("FROM table"); q.setFirstResult(start); q.setMaxResults(maxRows); 

如果你不想在Query对象上使用setMaxResults() ,那么你总是可以恢复使用普通的SQL。

如果你不想使用setMaxResults,你也可以使用Query.scroll而不是list,并获取你想要的行。 例如对于分页很有用。

String hql = "select userName from AccountInfo order by points desc 5";

这对我没有使用setmaxResults();

只需在最后(在这种情况下为5)中提供最大值,而不使用关键字limit 。 :P

我的观察是,即使你在HQL(Hibernate 3.x)中有限制,它将导致parsing错误或只是忽略。 (如果在限制之前按+ desc / asc命令,则会被忽略,如果在限制之前没有desc / asc,则会导致parsing错误)

如果可以在这个模式下pipe理一个限制

 public List<ExampleModel> listExampleModel() { return listExampleModel(null, null); } public List<ExampleModel> listExampleModel(Integer first, Integer count) { Query tmp = getSession().createQuery("from ExampleModel"); if (first != null) tmp.setFirstResult(first); if (count != null) tmp.setMaxResults(count); return (List<ExampleModel>)tmp.list(); } 

这是处理限制或列表的非常简单的代码。

 Criteria criteria=curdSession.createCriteria(DTOCLASS.class).addOrder(Order.desc("feild_name")); criteria.setMaxResults(3); List<DTOCLASS> users = (List<DTOCLASS>) criteria.list(); for (DTOCLASS user : users) { System.out.println(user.getStart()); }