Dragg
Dragg

Reputation: 83

Conditional mapping by method parameter

I have this 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;
}

And I have to mapper with this entity:

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

  private Integer id;   

  private Candidate candidate;

}

Mapper:

@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);

}

Problem

I have to specify jpa atribute to map, is there a way to map a jpa attribute with a param method? For example, in this case I map with candidateSender but, how I can map with candidateReceiver?

  @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);

This show the following error:

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

Upvotes: 0

Views: 228

Answers (1)

Paul Marcelin Bejan
Paul Marcelin Bejan

Reputation: 1675

The problem is that:

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

doesn't know which mapping method to use because there are two of them:

  • toModel
  • toSenderModel

So to solve that, you need to do the following:

@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);

}

As you can see, I added @Named and @IterableMapping.

Upvotes: 3

Related Questions