如何在QueryDsl中对distinct枚举查询结果按ordinal排序
在QueryDsl中直接实现枚举值去重并按ordinal排序
当然可以直接在QueryDsl里搞定这个需求,不用在Java代码里额外做排序或去重的处理~你的问题主要出在使用any()的方式不对,any()更多是用来做存在性判断的,没法帮你正确投影集合里的枚举元素并排序。
这里给你一个可行的写法,假设你的实体对应QueryDsl的路径是QEntity qEntity = QEntity.entity,枚举类型是YourEnum:
List<YourEnum> sortedDistinctEnums = new JPAQuery<>(entityManager) .select(qEntity.enumList) .from(qEntity) .join(qEntity.enumList) // 关联枚举集合,让QueryDsl能正确访问集合中的元素 .distinct() // 去重枚举值 .orderBy(qEntity.enumList.ordinal().asc()) // 按枚举的ordinal值升序排序 .fetch();
为什么这个写法能行?
- 用
join替代any():join会把实体和它的枚举集合做关联,这样我们就能直接投影集合里的枚举元素,而不是用any()做模糊的存在性查询。 - 直接调用
ordinal():QueryDsl的枚举路径支持直接访问ordinal()方法,它会被转换成对应的SQL排序逻辑,让数据库层面完成排序,比在Java内存里排序效率更高。 distinct()保证结果里没有重复的枚举值,同样是数据库层面完成去重。
如果你的枚举是用EnumType.STRING映射的也没关系,ordinal()是枚举本身的属性,QueryDsl依然能正确解析它对应的排序逻辑。
内容的提问来源于stack exchange,提问作者Laurin
相关产品推荐
相关产品推荐

