Hibernate中如何获取排序结果里的第一组数据?
解决方案:获取年龄最小的所有作者
要拿到按年龄升序后的第一组(也就是所有年龄最小的作者),你原来的查询只是做了排序但没有过滤逻辑,所以会返回全部数据。这里有几种实用的修改方式:
方法1:分步查询(直观易理解)
先查询出数据库中作者的最小年龄值,再用这个值作为条件筛选所有匹配的作者:
// 第一步:获取最小年龄 Integer minAge = (Integer) session.createQuery("SELECT MIN(A.age) FROM Author A").uniqueResult(); // 第二步:查询所有年龄等于最小年龄的作者,按id排序和示例结果一致 String hql = "FROM Author A WHERE A.age = :minAge ORDER BY A.id ASC"; Query query = session.createQuery(hql); query.setParameter("minAge", minAge); List<Author> results = query.list();
方法2:子查询一步完成
把获取最小年龄的逻辑嵌套到主查询里,一次执行就能得到目标结果:
String hql = "FROM Author A WHERE A.age = (SELECT MIN(age) FROM Author) ORDER BY A.id ASC"; Query query = session.createQuery(hql); List<Author> results = query.list();
方法3:窗口函数(适合高版本Hibernate)
如果你的Hibernate版本在5.2及以上(支持SQL窗口函数),可以用RANK()函数直接分组并筛选第一组数据:
String hql = """ SELECT a FROM ( SELECT A, RANK() OVER(ORDER BY A.age ASC) as ageRank FROM Author A ) subQuery WHERE subQuery.ageRank = 1 ORDER BY subQuery.A.id ASC """; Query query = session.createQuery(hql); List<Author> results = query.list();
以上三种方法都能返回你需要的结果:所有年龄为20的作者,按id升序排列。
内容的提问来源于stack exchange,提问作者Omkar Shetkar
相关产品推荐
相关产品推荐

