代码之家  ›  专栏  ›  技术社区  ›  José Sierra

按方法参数的条件映射

  •  0
  • José Sierra  · 技术社区  · 2 年前

    我有这个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-atribute来映射,有没有办法用param方法映射jpa属性?例如,在这种情况下,我使用candidateSender进行映射,但是,如何使用candiateReceiver进行映射?

      @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)
    
    0 回复  |  直到 2 年前
        1
  •  3
  •   Paul Marcelin Bejan    2 年前

    问题在于:

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

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

    • to模型
    • 至发送方模型

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

    @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。