从Spring Data存储库获取DTO对象的页面

Dav*_*cía 6 spring dto spring-data

我正在尝试在Spring项目中使用DTO来解耦业务和表示,但是在从Spring Data存储库中检索数据时遇到了问题.这里我有一个示例代码:

public Page<UserDto> findAll(int pageIndex) {
    return userRepository.findAll(createPageable(pageIndex)); // Page<User>
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我正在尝试返回UserDto的页面,但我正在获取一个User页面.

我怎样才能做到这一点?

小智 14

你可以这样做:

public Page<UserDto> findAll(Pageable p) {
    Page<User> page = userRepository.findAll(p); // Page<User>
    return new PageImpl<UserDto>(UserConverter.convert(page.getContent()), p, page.getTotalElements());
}
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果DTO返回的是不同表的信息的汇编,那您需要对数据库进行额外的调用吗? (2认同)

小智 9

从 Spring-Data 1.10 开始,您可以使用该Page#map函数:

public Page<UserDto> findAll(Pageable p) {
    return userRepository.findAll(p).map(UserConverter::convert);
}
Run Code Online (Sandbox Code Playgroud)

请参阅Spring 数据。该UserConverter#convert方法接受 aPerson并将其转换为PersonDto

public PersonDto convert(Person person) {
    return new PersonDto(person.getXyz1(), person.getXyz2);
}
Run Code Online (Sandbox Code Playgroud)