当前位置: 首页 > 知识库问答 >
问题:

是否使用mapstruct自动映射spring分页/排序

马宜民
2023-03-14

我喜欢使用mapstruct,但我找不到:是否有一个函数将Pagable中的排序转换为映射的dto可分页到实体可分页?

链接:

可分页:https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Pageable.html

排序:https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/domain/Sort.html

故事:

有一个请求:

@GetMapping("find")
public List<DTO> findAll(final Pageable pageable) {
    return mapper.map(repository.findAll(pagable));
}

和存储库:

public interface Repository extends JpaRepository<Entity, Long> {
   Page<Entity> findAll(Pageable pageable);
}

如果我不想公开实体列名,那么我映射列。例如:

@Mapper
public interface DTOMapper {

    @Mappings({
       @Mapping(source = "make", target = "manufacturer"),
    })
    DTO toDto(Entity entity);
}

现在API/返回值有制造商。排序请求(包含在可分页中)使用制造商而不是make是可能的:排序=制造商;asc

但是一定不是ort=make; asc,或者JpaRepository可以处理它吗?

那么,有没有一种简单的方法可以将可分页内容从请求转换为正确的可分页内容(使用正确的排序)?

Thx获取答案。

共有1个答案

锺博耘
2023-03-14

很好地回答了您的问题“是否有一种简单的方法可以将可分页从请求转换为正确的可分页”。

如果要使用准备好的映射器转换从db实体检索到的可分页内容,可以使用以下方法:

repository.findAll(pageable).map(myMapper::toDto)

可分页抽象具有map方法:

返回一个新页面,其中当前页面的内容由给定函数映射。

我理解,在您的情况下,您还希望根据准备好的映射修改请求的排序参数(在执行请求时修改参数命名,在返回响应时修改反向名称,以便JPA存储库正确执行)。

不幸的是,在这种情况下,我很抱歉,您必须准备自己的cusom映射方法。我建议您可以创建非常类似的方法,但您可以扩展逻辑,并根据提供的映射到映射器的注释修改/创建新的排序,该注释将基于mapstruct映射定义。它需要一些Java反射知识,但通过这种方法,您可以创建非常灵活和通用的映射器(如果您感兴趣,最好为MapStruct创建扩展)。

希望这有帮助。

 类似资料:
  • 我有一个相当大的bean(~100个属性),映射到几个较小的对象中。可能会出现这样的情况:较小的目标对象的属性与我的源bean中的名称相同,但语义不同。 我希望MapSTRt在这个特定的情况下只映射我使用注释显式告诉的内容,而不执行通常的自动映射。 MapStruct文档告诉我: 在生成的方法实现中,源类型(…)的所有可读属性将被复制到目标类型(…)中的相应属性中。 我没有找到任何配置选项来关闭此

  • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

  • 是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?

  • 我在遵循这个关于部分更新的教程。按照指示,我创建了带有适当注释的映射器接口。 这是映射器 根据本教程,将映射器生成为一个Spring bean,可以通过检索。 我得到这个错误,我的应用程序启动失败。 最后,这里是我的项目的。 我也尝试了这些不同的解决方案,但结果相同。 由@som回答 由@gunnar回答 请帮忙,谢谢:)

  • 我正在使用MapStruct和在我的代码中的不同业务用例之间共享的大模型(超过50个字段)。根据入口点的不同,有些属性将被映射,有些则不被映射。当我构建我的项目时,我总是会得到“警告:未映射的目标属性”消息。 我已经研究过,并且看到可以通过使用语义命令来告诉mapstruct忽略该字段 问题是,给定我的对象具有如此多的字段,忽略每个映射器类中的每个属性将需要大量的代码。我也不想在我的日志上出现这个

  • 我对这些技术是新的,所以提前道歉。 我在我的应用程序中使用了springboot、Spring JPA、hibernate和mapstruct。