小编典典

Spring Data Rest-按嵌套属性排序

spring-boot

我有一个使用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.lastNamesort = nameLastName 也不起作用。

我是否将Rest请求的格式错误或缺少某些配置?

谢谢!


阅读 327

收藏
2020-05-30

共1个答案

小编典典

我调试通过,看起来像艾伦提到的问题。

我发现可以帮助解决问题的方法:

创建自己的控制器,注入您的仓库和可选的投影工厂(如果需要投影)。实现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; 这个问题似乎存在于所有版本中。

2020-05-30