在Hibernate 3中,是否有一种方法可以在HQL中实现与以下MySQL限制相同的功能?

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

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


当前回答

你可以使用下面的查询

NativeQuery<Object[]> query = session.createNativeQuery("select * from employee limit ?");
query.setparameter(1,1);

其他回答

 // SQL: SELECT * FROM table LIMIT start, maxRows;

Query q = session.createQuery("FROM table");
q.setFirstResult(start);
q.setMaxResults(maxRows);

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

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

这为我工作,没有使用setmaxResults();

只在最后一个(在本例中是5)中提供最大值,而不使用关键字limit。 : P

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());
            }

几年前,当被问及为什么这在Hibernate 2中有效而在Hibernate 3中无效时,这篇文章发布在Hibernate论坛上:

限制从来不是一个受支持的条款 在HQL。你是用来使用的 setMaxResults()。

因此,如果它能在Hibernate 2中工作,那似乎是巧合,而不是设计。我认为这是因为Hibernate 2 HQL解析器将替换它识别为HQL的部分查询,并保留其余部分,因此您可以潜入一些本地SQL。然而,Hibernate 3有一个合适的AST HQL解析器,它不那么宽容。

我认为Query.setMaxResults()是你唯一的选择。