我有一个实体和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映射到对象?
我已经通过qualifiedByName做到了:
import java.util.List;
@Mapper(componentModel = "spring", uses = { IdTranslator.class})
public interface GroupParameterMapper {
//...
@Mapping(target = "id", ignore = true)
@Mapping(target = "typeReport", source ="typeReportId", qualifiedByName = { "idTranslator", "toTypeReport" })
GroupParameter fromGroupParameterIdDTO(GroupParameterIdDTO groupParameterIdDTO) throws EntityNotFoundException;
//...
}
@Named("IdTranslator")
public class IdTranslator {
@Autowired
TypeReportService typeReportService;
@Named("toTypeReport")
public TypeReport toTypeReport(Long typeReportId) throws EntityNotFoundException {
if (typeReportId != null) {
return typeReportService.findById(typeReportId);
} else {
return null;
}
}
}
我不知道为什么我应该在类之前使用@Named(因此在官方指南中已完成),因为没有它,它会很好地工作。
限定符中使用的所有方法都必须可供实现类访问。当前,fromLongToTypeReport
是私有的。您应该将其设置为package-protected
,protected
或public
,它将可以使用。