Spring-通过使用另一个表的字段,可以使用Distinct和order进行分页

Spring-通过使用另一个表的字段,可以使用Distinct和order进行分页,spring,oracle,spring-boot,spring-data-jpa,criteriaquery,Spring,Oracle,Spring Boot,Spring Data Jpa,Criteriaquery,我有一个自定义存储库,这是我用来根据某个过滤器查找运输者的方法,按选择的任何列排序,包括组织编号、运输者、地址行1、邮政编码和邮政名称 @凌驾 公共页getTransportersPagedMap筛选器,int-first,int-pageSize,字符串排序, 布尔降序抛出DatabaseConnectionException { logger.infoGet paged transporters.First{},pageSize{},sortBy{},filters{},First,page

我有一个自定义存储库,这是我用来根据某个过滤器查找运输者的方法,按选择的任何列排序,包括组织编号、运输者、地址行1、邮政编码和邮政名称

@凌驾 公共页getTransportersPagedMap筛选器,int-first,int-pageSize,字符串排序, 布尔降序抛出DatabaseConnectionException { logger.infoGet paged transporters.First{},pageSize{},sortBy{},filters{},First,pageSize,sortBy,filters; 列表顺序=新的ArrayList; 如果sortBy!=null { orders.addnew Sort.Orderdescending?Sort.Direction.DESC:Sort.Direction.ASC,sortBy.ignoreCase; } orders.addnew Sort.OrderSort.Direction.ASC,orgNumber; 规格说明; 尝试 { 规格=过滤器; ifsortBy!=null&&sortBy.containsaddress { 规范=规范.andTransporterSpecifications.sortByAddressField; } } 捕获应用程序NotFounde异常 { 找不到许可证号{},e的logger.debugApplication; 返回null; } 返回transporterRepository.findAllspecification、PageRequest.Offfirst/pageSize、pageSize、Sort.byorders; } 当我尝试按地址排序时,我得到了ORA-01791,因此我在我的TransporterSpecification中创建了SortByAddress字段:

公共静态规范sortByAddressField { 返回新的可接合规范 { @凌驾 公共谓词toPredicateRoot、CriteriaQuery cq、CriteriaBuilder cb { 如果cq.getResultType!=Long.class&&cq.getResultType!=Long.class{ Fetch address=root.fetchaddress,JoinType.LEFT; Fetch-postofficeFetch=address.fetchpostoffice,JoinType.LEFT; }否则{ 连接地址=root.joinaddress,JoinType.LEFT; Join邮局=address.joinpostoffice,JoinType.LEFT; } 返回null; } }; } 现在,我可以按地址行1和邮政编码进行排序,但我仍然很难按邮政名称进行排序。每当我按邮政名称排序时,仍然会收到ORA-01791

运输公司与地址有多对一关系,地址与邮局有多对一关系


我如何明确地告诉Spring选择邮局的字段?谢谢

我认为没有办法强迫Hibernate在查询中从连接的表中选择特定的冗余字段。我能想到的唯一解决办法是直接使用CriteriaAPI,使用criteriaQuery.multiselect选择所有相关字段。。。。您需要创建一个自定义存储库片段,手动处理排序和分页,尽管我尝试了multiselect,但没有成功。您如何手动处理排序和分页?我的意思是,当直接与Criteria API交互时,您必须使用Query.setFirstResult和Query.setMaxResults,而不是依赖Spring的可分页