【问题标题】:Hibernate: how can I retrieve last N entries with Criteria Interface? [duplicate]Hibernate:如何使用 Criteria Interface 检索最后 N 个条目? [复制]
【发布时间】:2014-11-03 19:06:36
【问题描述】:

如何从数据库中检索最后 N 个条目 使用 Hibernate Criteria 接口?

Criteria crit = hiberSession.createCriteria(UserTable.class);

或者甚至会更好地检索随机 N 个条目...

【问题讨论】:

    标签: java database hibernate hibernate-criteria


    【解决方案1】:

    最后一个总是依赖于ORDER BY。所以我们应该首先对列表进行排序以确定最后一个是什么。然后颠倒顺序(例如 desc)会将第一个移到顶部

    一旦定义了订单,我们就可以使用分页了

    如果您需要在结果集上指定边界,即要检索的最大行数和/或要检索的第一行,您可以使用 Query 接口的方法:

    Query q = sess.createQuery("from DomesticCat cat");
    q.setFirstResult(20);
    q.setMaxResults(10);
    List cats = q.list();
    

    在这种情况下,我们会有类似的

    ...
    crit.setFirstResult(20);
    crit.setMaxResults(10);
    ...
    

    【讨论】:

      【解决方案2】:

      您必须获取总数,然后获取最后 N 条记录。

              Criteria count = session.createCriteria(UserTable.class);
              count.setProjection(Projections.rowCount());
              Long total = count.uniqueResult();
      
              int n;
      
              Criteria criteria = session.createCriteria(UserTable.class);
              criteria.setFirstResult(total-n);
              criteria.setMaxResults(n);
      
              List<UserTable> list = criteria.list();
      

      如果您维护条目时间戳,那么您可以添加订单并获取最后 n 个结果

          Criteria criteria = session.createCriteria(UserTable.class);
          criteria.addOrder(Order.desc("timestamp"));
          criteria.setMaxResults(n);
      
          List<UserTable> list = criteria.list();
      

      要获得任何随机条目,请将您的第一个结果设置为任何随机值,该值必须小于总数。

      【讨论】:

      • 哪种方法效率更高?
      • @devesh-ahuja,如果您在timestamp 列上有索引,那么第二种方法肯定会更快。要清楚last N records 仅在您对记录进行排序时才有意义。否则,您将根据数据库的自然顺序获取记录。
      • 感谢您的解释。我也尝试并观察到了同样的行为。
      • 它以混乱的顺序检索(不按 id 排序)
      猜你喜欢
      • 2013-03-19
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      相关资源
      最近更新 更多