JPA自定义查询如何按关联表@OrderColumn字段对返回结果排序
解决方案
你可以直接使用JPA 2.0+内置的INDEX()函数获取@OrderColumn对应的排序字段值,修改你的JPQL查询如下即可实现按sort_index排序:
@Query( """ select q from Game g join g.questions q where g.id = :game order by INDEX(q) """ ) Collection<Question> findAllByGame(UUID game);
说明
INDEX()函数专门用于获取被@OrderColumn标注的有序集合中元素的排序索引,这里直接对应关联表game_questions的sort_index字段,不需要手动关联中间表。- 上述写法采用显式
JOIN关联,相比你原来的隐式关联笛卡尔积过滤写法,查询性能更高,逻辑也更简洁。
如果碰到JPA实现对INDEX()函数兼容性不佳的场景,可以改为原生SQL查询实现:
@Query( value = """ select q.* from question q join game_questions gq on q.id = gq.questions_id where gq.game_id = :game order by gq.sort_index """, nativeQuery = true ) Collection<Question> findAllByGame(UUID game);
注意:原生SQL中的表名、字段名需要和你项目JPA命名策略生成的实际库表结构保持一致,如有自定义命名规则需对应调整。
内容的提问来源于stack exchange,提问作者dpozinen
相关产品推荐
相关产品推荐

