我有一个使用Spring Boot 1.5.1和Spring Data Rest的数据库服务。我将实体存储在MySQL数据库中,并使用Spring的PagingAndSortingRepository通过REST访问它们。我发现这表明支持按嵌套参数进行排序,但是我找不到按嵌套字段进行排序的方法。
我有这些课:
@Entity(name = "Person") @Table(name = "PERSON") public class Person { @ManyToOne protected Address address; @ManyToOne(targetEntity = Name.class, cascade = { CascadeType.ALL }) @JoinColumn(name = "NAME_PERSON_ID") protected Name name; @Id protected Long id; // Setter, getters, etc. } @Entity(name = "Name") @Table(name = "NAME") public class Name{ protected String firstName; protected String lastName; @Id protected Long id; // Setter, getters, etc. }
例如,使用方法时:
Page<Person> findByAddress_Id(@Param("id") String id, Pageable pageable);
并调用URI http:// localhost:8080 / people / search / findByAddress_Id?id = 1&sort = name_lastName,desc ,Spring会完全忽略sort参数。
参数 sort = name.lastName 和 sort = nameLastName 也不起作用。
我是否将Rest请求的格式错误或缺少某些配置?
谢谢!
我调试通过,看起来像艾伦提到的问题。
我发现可以帮助解决问题的方法:
创建自己的控制器,注入您的仓库和可选的投影工厂(如果需要投影)。实现get方法以将调用委托给您的存储库
@RestController @RequestMapping("/people") public class PeopleController { @Autowired PersonRepository repository; //@Autowired //PagedResourcesAssembler<MyDTO> resourceAssembler; @GetMapping("/by-address/{addressId}") public Page<Person> getByAddress(@PathVariable("addressId") Long addressId, Pageable page) { // spring doesn't spoil your sort here ... Page<Person> page = repository.findByAddress_Id(addressId, page) // optionally, apply projection // to return DTO/specifically loaded Entity objects ... // return type would be then PagedResources<Resource<MyDTO>> // return resourceAssembler.toResource(page.map(...)) return page; } }
这对我来说适用于2.6.8.RELEASE; 这个问题似乎存在于所有版本中。