【发布时间】:2014-11-03 19:06:36
【问题描述】:
如何从数据库中检索最后 N 个条目 使用 Hibernate Criteria 接口?
Criteria crit = hiberSession.createCriteria(UserTable.class);
或者甚至会更好地检索随机 N 个条目...
【问题讨论】:
标签: java database hibernate hibernate-criteria
如何从数据库中检索最后 N 个条目 使用 Hibernate Criteria 接口?
Criteria crit = hiberSession.createCriteria(UserTable.class);
或者甚至会更好地检索随机 N 个条目...
【问题讨论】:
标签: java database hibernate hibernate-criteria
最后一个总是依赖于ORDER BY。所以我们应该首先对列表进行排序以确定最后一个是什么。然后颠倒顺序(例如 desc)会将第一个移到顶部
crit.addOrder(Order.desc("name"))
一旦定义了订单,我们就可以使用分页了
如果您需要在结果集上指定边界,即要检索的最大行数和/或要检索的第一行,您可以使用 Query 接口的方法:
Query q = sess.createQuery("from DomesticCat cat");
q.setFirstResult(20);
q.setMaxResults(10);
List cats = q.list();
在这种情况下,我们会有类似的
...
crit.setFirstResult(20);
crit.setMaxResults(10);
...
【讨论】:
您必须获取总数,然后获取最后 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();
要获得任何随机条目,请将您的第一个结果设置为任何随机值,该值必须小于总数。
【讨论】:
timestamp 列上有索引,那么第二种方法肯定会更快。要清楚last N records 仅在您对记录进行排序时才有意义。否则,您将根据数据库的自然顺序获取记录。