Hibernate:如何选择除最后N行之外的所有行?

时间:2016-10-04 13:39:49

标签: java mysql hibernate

我正在尝试运行Hibernate查询,该查询返回除最后5行之外的所有行,因此我的sql查询如下:

session.createQuery("FROM Book 
WHERE id NOT IN(SELECT id FROM Book ORDER BY ID DESC LIMIT 5) 
ORDER BY title");

很遗憾,LIMIT中不允许使用Hibernate,因此我收到错误消息:

  

HTTP状态500 - org.hibernate.hql.internal.ast.QuerySyntaxException:   意外标记:LIMIT靠近第1行第78列[FROM models.Book WHERE   id NOT IN(SELECT id FROM models.Book ORDER BY ID DESC LIMIT 5)ORDER   按标题]

我如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

这里有一个答案

How do you do a limit query in HQL?

  

在HQL中,Limit永远不是受支持的子句。您应该使用setMaxResults()。

答案 1 :(得分:1)

好像你在问hibernate pagination

首先得到计数:

String countQ = "Select count (f.id) from Foo f";
Query countQuery = session.createQuery(countQ);
Long countResults = (Long) countQuery.uniqueResult();

然后计算你的极限起点和终点:

Long start = countResult - limit;

然后使用分页未来:

Session session = sessionFactory.openSession();
Query query = sess.createQuery("From Foo");
query.setFirstResult(start );
query.setMaxResults(limit);
List<Foo> fooList = fooList = query.list();

您可能需要更新查询,但我相信您明白了

答案 2 :(得分:0)

我还问了类似的限制问题&#34; LIMIT&#34; hibernate中的关键字。

Hibernate: how to select last N rows in ascending order of id? (in single query)

我认为只剩下两种方式,虽然它不是最好的表现。

  1. 两个查询(获取id列表,然后使用NOT IN id列表查询)
  2. 进行进一步数据处理的一个查询(例如,从结果列表中删除最后5个数据)
  3. 希望有所帮助