【问题标题】:Hibernate: how to select all rows but the last N rows?Hibernate:如何选择除最后 N 行之外的所有行?
【发布时间】:2017-02-12 17:06:00
【问题描述】:

我正在尝试运行一个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 按标题]

我该如何解决这个问题?

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    我也问过类似的问题,与hibernate中“LIMIT”关键字的限制有关。

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

    我认为只有两种方式,虽然这不是最好的表现。

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

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      好像你在问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;
      

      然后使用分页future:

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

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

      【讨论】:

      • setFirstResult 不接受Long,只接受'int
      • 而且这个方法没有返回正确的(按id排序)顺序
      【解决方案3】:

      这里有答案

      How do you do a limit query in HQL?

      Limit 在 HQL 中从来不是受支持的子句。你应该使用 setMaxResults()。

      【讨论】:

      • 我知道,但我不能在我的情况下使用这种方法,除非我循环 LIMITED 结果然后进行选择。我需要表现更好的东西:)
      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多