【问题标题】:Getting a Page of DTO objects from Spring Data repository从 Spring Data 存储库中获取 DTO 对象的页面
【发布时间】:2015-02-17 20:52:12
【问题描述】:

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

public Page<UserDto> findAll(int pageIndex) {
    return userRepository.findAll(createPageable(pageIndex)); // Page<User>
}

如您所见,我试图返回一个 UserDto 页面,但我得到一个 User 页面。

我该怎么做?

【问题讨论】:

    标签: spring spring-data dto


    【解决方案1】:

    你可以这样做:

    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());
    }
    

    【讨论】:

    • 但是如果返回的DTO是不同表信息的汇编,那需要额外调用数据库吗?
    【解决方案2】:
    public Page<PersonDto> findAllPageableOrderBylastName(Pageable pageable) {
            Page<Person> personPage = personRepository.findAllByLastNameIsNotNullOrderByLastName(pageable);
            int totalElements = (int) personPage.getTotalElements();
            return new PageImpl<PersonDto>(personPage.getContents()
                    .stream()
                    .map(person -> new PersonDto(
                            person.getId(),
                            person.getFirstName(),
                            person.getLastName(),
                            person.getNumberMobil(),
                            person.getPresentPosition()))
                    .collect(Collectors.toList()), pageable, totalElements);
            }
    

    我刚开始编程。我意识到了。在职的。 :)

    【讨论】:

    • 这是什么PageImpl?我有同样的情况,我想设置相同的方法。
    • 应该是:return new PageImpl(personPage.getContents().stream() ...
    【解决方案3】:

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

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

    Spring DataUserConverter#convert 方法接受 Person 并将其转换为 PersonDto

    public PersonDto convert(Person person) {
        return new PersonDto(person.getXyz1(), person.getXyz2);
    }
    

    【讨论】:

    • 这是最好的答案。使用 PageImpl 您可能会丢失页面信息,例如页数,如果该页面是最后一页等等......我还建议使用 mapstruct 将实体转换为 entityDTO。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2023-03-27
    • 2016-12-13
    • 1970-01-01
    相关资源
    最近更新 更多