基于Criteria Builder实现双列排序需求的技术问询
解决方案
- 拆分排序逻辑,不要对第一列的实际值做排序,只针对「是否为null」做优先级区分,再叠加第二列的降序规则即可:
- 先通过判断第一列是否为空,把null值固定到末尾(不用对第一列本身做值排序)
- 直接对第二列做全局降序排序,不依赖第一列的取值
代码示例
// 假设实体类对应字段为firstCol(第一列)、secondCol(第二列) CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<YourEntity> query = cb.createQuery(YourEntity.class); Root<YourEntity> root = query.from(YourEntity.class); // 规则1:第一列null值后置,仅区分null/非null,不排序列值 Order nullLastRule = cb.asc(cb.isNull(root.get("firstCol"))); // 规则2:第二列全局降序排序 Order secondColDescRule = cb.desc(root.get("secondCol")); // 组合排序规则 query.orderBy(nullLastRule, secondColDescRule); // 执行查询 List<YourEntity> result = entityManager.createQuery(query).getResultList();
逻辑说明
cb.isNull(root.get("firstCol"))返回布尔表达式,用asc()排序时,非null对应的false会排在null对应的true前面,刚好实现null后置- 第二列的降序是全局生效的,不会受第一列值的影响——因为我们没有对第一列的实际值做排序,只是做了null/非null的分组
内容的提问来源于stack exchange,提问作者saket
相关产品推荐
相关产品推荐

