Spring Boot中orm.xml命名原生查询的Pageable排序不生效问题
问题根因
- 构造Pageable时未正确传入排序方向参数,Sort规则不完整
- orm.xml中定义的命名原生查询默认不会自动拼接Pageable携带的排序条件,需要显式指定占位符
- Repository方法返回值类型不匹配,分页查询需返回
Page类型才能让Spring Data JPA完整处理分页排序逻辑 - 若传入的排序字段与SQL查询的列别名不匹配,也会导致排序不生效
解决方案
1. 修正Pageable构造逻辑,补全排序方向
你当前的构造代码仅传入了排序字段,未使用自定义封装类中的direction参数,修正为:
Sort.Direction direction = "desc".equalsIgnoreCase(obj.getDirection()) ? Sort.Direction.DESC : Sort.Direction.ASC; Pageable pageable = PageRequest.of(obj.getPage(), obj.getSize(), Sort.by(direction, obj.getSort()));
2. 修正Repository方法返回值
将返回值从List<DeptStuInfo>改为Page<DeptStuInfo>,让Spring Data JPA完整处理分页排序逻辑:
@Query(nativeQuery = true) public Page<DeptStuInfo> deptEmplInfosPageable(Pageable pageable);
3. orm.xml的原生SQL末尾添加分页排序占位符
在查询语句的末尾添加#pageable占位符,Spring Data JPA会自动将排序、分页条件拼接到SQL末尾:
<named-native-query name="Student.deptEmplInfosPageable" result-set-mapping="DeptEmplMapping"> <query><![CDATA[select dept.name as deptName,stu.name as stuName,stu.doj as stuDoj from department dept,student stu where dept.id=stu.studeptId group by dept.name,stu.name,stu.doj #pageable ]]> </query> </named-native-query>
4. 保证排序字段与SQL别名一致
传入的sort参数必须和SQL中定义的列别名完全一致,比如要按学生姓名排序,sort参数需传stuName(SQL别名),不能传实体类属性名studentName。
内容的提问来源于stack exchange,提问作者user1690808
相关产品推荐
相关产品推荐

