Spring Data JPA中如何按含下划线的Formula字段排序?
解决Spring Data JPA中@Formula字段排序的语法问题
首先注意你的InnerClass里@Formula存在语法错误:CASE语句结尾多了一个多余的右括号,正确写法建议添加AS(部分数据库可省略,更规范):
@Formula(""" CASE WHEN t2.field2 IS NULL THEN t2.field3 ELSE t2.field2 || ' ' || t2.field4 END AS _my_field """) private String _myField;
针对排序时JPA展开CASE语句导致的语法问题,有两种可靠解决方式:
方式一:使用原生SQL查询
直接编写原生查询,在ORDER BY子句中直接引用数据库端的别名_my_field,彻底避免JPA展开CASE语句:
@Query(value = "SELECT o.* FROM outer_class o " + "INNER JOIN inner_class i ON o.fk_inner = i.id " + "WHERE o.id = :id " + "ORDER BY i._my_field", nativeQuery = true) List<OuterClass> findByIdOrderedByMyField(@Param("id") Integer id);
注意替换outer_class、inner_class为你实际的数据库表名,关联条件要和实体的外键映射一致。
方式二:调整JPQL查询的关联写法
如果偏好JPQL,可以通过显式关联innerElement并取别名,引导JPA正确识别Formula字段的引用:
@EntityGraph(attributePaths = {"innerElement"}) @Query("SELECT o FROM OuterClass o JOIN o.innerElement i WHERE o.id = :id ORDER BY i._myField") List<OuterClass> findById(@Param("id") Integer id);
这种方式下多数JPA实现(如Hibernate)能正确处理排序,但如果仍出现CASE语句展开问题,优先选择原生查询方案。
内容的提问来源于stack exchange,提问作者smeds
相关产品推荐
相关产品推荐

