首页 > 解决方案 > MapStruct:如何制作从 Long 到 Object 的映射方法?

问题描述

我有一个实体和 DTO。

@Entity
@Data
public class GroupParameter {

    @Id
    @GeneratedValue(generator = ID_GENERATOR)
    private Long id;
    private String title;
    private boolean common;
    @ManyToOne
    @JoinColumn(name = "TYPE_REPORT_ID", nullable = false)
    private TypeReport typeReport;

}

@Data
public class GroupParameterIdDTO extends GroupParameterAbstract {

    private Long typeReportId;

}

当我从 DTO 映射到实体时,我需要将 Long typeReportId 映射到 TypeReport typeReport。

我尝试这样做:

@Mapper(componentModel = "spring")
public abstract class GroupParameterMapper {

    @Autowired
    private TypeReportService typeReportService;

    @Mapping(target = "typeReport", source = "typeReportId", qualifiedByName = "fromLongToTypeReport")
    public abstract GroupParameter fromGroupParameterIdDTO(GroupParameterIdDTO groupParameterIdDTO);

    @Named("fromLongToTypeReport")
    private TypeReport fromLongToTypeReport(Long typeReportId) throws EntityNotFoundException {
        return typeReportService.findById(typeReportId);
    }
}

但我得到错误:

错误:(23,5)java:无法将属性“java.lang.Long typeReportId”映射到“ru.watchlist.domain.TypeReport typeReport”。考虑声明/实现一个映射方法:“ru.watchlist.domain.TypeReport map(java.lang.Long value)”。

如何通过 Id 在存储库中查找对象来将 Long 映射到对象?

标签: springspring-data-jpaentitydtomapstruct

解决方案


限定符中使用的所有方法都必须可供实现类访问。目前,fromLongToTypeReport是私有的。你应该成功package-protectedprotected否则public它会起作用。


在侧节点上,您不必使用限定符来映射LongTypeRecord。您可以只定义这样的方法,MapStruct 就可以进行映射。

@Mapper(componentModel = "spring")
public abstract class GroupParameterMapper {

    @Autowired
    private TypeReportService typeReportService;

    @Mapping(target = "typeReport", source = "typeReportId")
    public abstract GroupParameter fromGroupParameterIdDTO(GroupParameterIdDTO groupParameterIdDTO);

    protected TypeReport fromLongToTypeReport(Long typeReportId) throws EntityNotFoundException {
        return typeReportService.findById(typeReportId);
    }
}

推荐阅读