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

如何使mapstruct映射器返回null而不是所有字段都设置为null的新对象

卫子平
2023-03-14

大家好!

我正在Spring应用程序中实现Mapstruct映射器。

有两个相关实体:userorder。只是为了简化->用户可以有许多订单。

    public class Order {
    
        ...
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name = "user_id")
        private User user;
        ...
    }
    public class OrderDTO {
    
        ...
    
        private Long userId;
    
        ...
    
    }
    public class User {
    
        ...
    
        @OneToMany(mappedBy = "user", orphanRemoval = false, fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
        private Set<Order> orders;
    
        ...
    }
    public class UserDTO {
    
        ...
    
        private Set<Long> ordersIds;
    
        ...
    }
public interface CommonMapper<E extends AbstractEntity, D extends AbstractDto> {

    D toDto(E e);

    E fromDto(D dto);

    Set<D> toSetDto(Set<E> e);

    Set<E> fromSetDto(Set<D> d);

    List<D> toListDto(List<E> e);

    List<E> fromListDto(List<D> d);
}

OrderMapper类:

@Mapper(componentModel = "spring")
public interface OrderMapper extends CommonMapper<Order, OrderDTO> {
    OrderMapper INSTANCE = Mappers.getMapper(OrderMapper.class);

    @Override
    @Mapping(source = "user.id", target = "userId")
    OrderDTO toDto(Order order);

    @Override
    @Mapping(source = "userId", target = "user.id")
    Order fromDto(OrderDTO dto);
}

好吧,我的问题是:

如果我使用以下命令传递OrderDTO:

前面描述的情况在我的应用程序中造成了巨大的问题。如果有任何帮助,我将不胜感激。

共有1个答案

夹谷山
2023-03-14

这不是一个优雅的解决方案,但它是有效的。我不确定Mapstruct是否已经修复了这个问题。

将此添加到OrderMapper中。

@AfterMapping
default Order afterMapping(@MappingTarget Order order) {
    if (order != null && order.getUser().getId() == null) {
        order.setUser(null);
    }
    return order;
}
 类似资料:
  • 如果(tagrecord.gettagid()==null&&tagrecord.gettaglabel()==null),我实际上希望生成的方法返回一个null标记对象。有没有可能,我该如何实现这一点?

  • 所以这是我以前在jooq 3.11中工作的查询。 我正在更新一个JSON字段,但是它使用Json绑定映射到我模型中的字符串,我将在下面发布 这在升级到jooq 3.13.2后不再有效。我还不得不将我的sql方言更改为mysql,即使我正在使用mysql 5_7数据库,这可能是问题所在? 我也试过这个,它还是一样的 JsonBinding.class JsonConverter.class 以下是j

  • 环境: jdk:17.0.1 映射:1.5.1.Final 使用默认配置,我生成了以下代码 但我想在source的所有字段都为null时返回null,如下所示 我应该如何配置它?

  • 尽管违反直觉,而且显然不是JPA标准所要求的,但Eclipselink和Hibernate都竭尽全力创建了以下NullPointerExceptions的源代码:当嵌入实体中的对象的所有字段都是null时,它们会将字段本身替换为null。下面是一个简化的例子: 我们的想法是,我们可以编写类似于。当直接访问字段时,我们会为此付出额外的间接代价:。这通常是一个很好的权衡,但当我们必须编写

  • 我试图使用MapStruct在dto和实体对象之间映射convert,但是生成的映射器实现只返回空的映射对象。 BeermapperImpl 任何人都可以提供我的代码可能出错的地方?谢谢!

  • 我有以下JPQL查询: 这应该返回所有对具有NULL的。 但是,我正在运行代码并进行调试,我看到返回的集合包含此字段为null的实体。 这是JPQL中的错误吗?