你如何做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()); }
- @ManyToOne(可选= false)和@Column(nullable = false)之间有什么区别?
- hibernate – @ElementCollection – 奇怪的删除/插入行为
- 需要重置Oracle中序列的值
- 我如何获得会话对象,如果我有entitymanager
- 使用睡眠()为单个线程
- 何时在NHibernate / Hibernate OneToMany关系上使用inverse = false?
- Hibernate 4有哪些新特性?
- 注解@Id和@GeneratedValue(strategy = GenerationType.IDENTITY)有什么用? 为什么生成types是身份?
- Hibernate中的persist()和merge()有什么区别?