首页 > 解决方案 > Hibernate:获取按 id ASC 排序的最后 N 行

问题描述

我有一张这样的桌子

id    name    age
1     John    54
2     Emily   68
3     Tom     235
4     Jack    68
5     Harry   12
6     Ron     68
7     ...
8     ...
9     ...     68
...   ...     ...
...   ...     ...
...   ...     ...
...   ...     68
...   ...     ...

现在我使用这段代码来获取特定年龄的人:

CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Person> cr = cb.createQuery(Person.class);
Root<Person> root = cr.from(Person.class);
cr.select(root).where(cb.equal(root.get("age"), 68));
Query<Person> query = session.createQuery(cr);
List<Person> result = query.getResultList();
session.close();

它将返回所有年龄 = 68 的人。

我可以通过添加以下内容来获得前 N 个 68 岁的人:

query.setMaxResults(N);

但是我不确定如何最后获得 N?

我试过了

int total = ((Long) count.uniqueResult()).intValue();
int start = total - N;
query.setFirstResult((start));
query.setMaxResults(N);

但它并没有准确返回 N last(当表按 id ASC 排序时,N last 是最后 N 行)。

标签: javahibernatehibernate-criteria

解决方案


只需改变结果的顺序。您可以通过添加以下内容来做到这一点:

cr.orderBy(cb.desc(root.get("id")));

如果您需要它变量,请将布尔值传递给方法:

if (selectFirst) {
    cr.orderBy(cb.asc(root.get("id")));
} else {
    cr.orderBy(cb.desc(root.get("id")));
}

推荐阅读