【问题标题】:Conditional mapping by method parameter通过方法参数进行条件映射
【发布时间】:2022-11-20 23:10:44
【问题描述】:

我有这个 jpa:

public class CandidateRecommendationJpa extends AuditingEntityJpa {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "ID_CANDIDATO_RECOMENDACION", nullable = false)
  private Integer id;

  @ManyToOne
  @JoinColumn(name = "ID_CANDIDATO_EMISOR", nullable = false)
  private CandidateJpa candidateSender;

  @ManyToOne
  @JoinColumn(name = "ID_CANDIDATO_RECEPTOR", nullable = false)
  private CandidateJpa candidateReceiver;
}

我必须映射这个实体:

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@EqualsAndHashCode
public class CandidateRecommendation {

  private Integer id;   

  private Candidate candidate;

}

映射器:

@Mapper(componentModel = "spring")
public interface CandidateRecommendationJpaMapper {

  CandidateRecommendationJpaMapper INSTANCE = Mappers.getMapper(CandidateRecommendationJpaMapper.class);

  @Mapping(target = "candidate.id", source = "candidateSender.id")
  @Mapping(target = "candidate.name", source = "candidateSender.name")
  @Mapping(target = "candidate.login", source = "candidateSender.employee.login")
  CandidateRecommendation toModel(CandidateRecommendationJpa jpa);

  List<CandidateRecommendation> toModels(List<CandidateRecommendationJpa> jpa);

}

问题

我必须指定要映射的 jpa 属性,有没有办法用参数方法映射 jpa 属性?例如,在这种情况下,我映射到候选发送者,但是我如何映射到候选接收者?

  @Mapping(target = "candidate.id", source = "candidateReceiver.id")
  @Mapping(target = "candidate.name", source = "candidateReceiver.name")
  @Mapping(target = "candidate.login", source = "candidateReceiver.employee.login")
  CandidateRecommendation toSenderModel(CandidateRecommendationJpa jpa);

  List<CandidateRecommendation> toSenderModels(List<CandidateRecommendationJpa> jpa);

这显示以下错误:

Ambiguous mapping methods found for mapping collection element to CandidateRecommendation: CandidateRecommendation toModel(CandidateRecommendationJpa jpa), CandidateRecommendation toSenderModel(CandidateRecommendationJpa jpa)

【问题讨论】:

    标签: java mapping mapstruct


    【解决方案1】:

    问题是:

    List<CandidateRecommendation> toSenderModels(List<CandidateRecommendationJpa> jpa);
    

    不知道使用哪种映射方法,因为有两种:

    • 到模型
    • toSenderModel

    因此,要解决该问题,您需要执行以下操作:

    @Mapper(componentModel = "spring")
    public interface CandidateRecommendationJpaMapper {
    
        CandidateRecommendationJpaMapper INSTANCE = Mappers.getMapper(CandidateRecommendationJpaMapper.class);
    
        @Named("toModel")
        @Mapping(target = "candidate.id", source = "candidateSender.id")
        @Mapping(target = "candidate.name", source = "candidateSender.name")
        @Mapping(target = "candidate.login", source = "candidateSender.employee.login")
        CandidateRecommendation toModel(CandidateRecommendationJpa jpa);
    
        @Named("toSenderModel")
        @Mapping(target = "candidate.id", source = "candidateReceiver.id")
        @Mapping(target = "candidate.name", source = "candidateReceiver.name")
        @Mapping(target = "candidate.login", source = "candidateReceiver.employee.login")
        CandidateRecommendation toSenderModel(CandidateRecommendationJpa jpa);
    
        @IterableMapping(qualifiedByName = "toModel")
        List<CandidateRecommendation> toModels(List<CandidateRecommendationJpa> jpa);
    
        @IterableMapping(qualifiedByName = "toSenderModel")
        List<CandidateRecommendation> toSenderModels(List<CandidateRecommendationJpa> jpa);
    
    }
    

    如您所见,我添加了@Named 和@IterableMapping。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-11
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2020-02-17
      • 2022-07-25
      相关资源
      最近更新 更多