映射结构多对一映射



我有一个关于mapstruct@ManyToOne映射的问题。我有两张桌子

第一个:

@Entity
@Table(name = "members", schema = vsm)
public class MemberEntity{
@Column(name = "id", nullable = false)
protected Long id;
@ManyToOne(optional = false)
@JoinColumn(name = "case_id", nullable = false)
private CaseEntity case;
}

第二个:

@Entity
@Table(name = "cases", schema = vsm)
public class CaseEntity {
@Column(name = "id", nullable = false)
protected Long id;
@Column(name = "description", nullable = false)
protected String description;
}

我有一个这样的案例:

public class CasesDto{
protected Long id;
protected String description;
private List<MemberDto> members;
}

和成员Dto与实体相同。

我需要像这样使用映射结构进行映射:

CasesDto mapToDto(CaseEntity entity);

我需要填写名单成员;但我不明白怎么做。

你不能简单地以这种方式将其映射到 CasesDto。没有要映射到List<MemberDto>的集合。您应该拥有完全组合的案例实体,其中包括:

@OneToMany(mappedBy = "cases")
private List<MemberEntity> members = new ArrayList<>();

为了避免最坏的情况 N+1 问题(stackOverflow N+1(,您应该正确配置 JPA(简短的弹簧 .yml 示例(,这将允许您由 ORM 执行1 + Math.ceil({MembersAmount}/{default_batch_fetch_size})查询:

spring:
jpa:
properties:
hibernate:
jdbc:
batch_size: 50
default_batch_fetch_size: 50

或者获取带有其他查询的成员列表,并以这种方式将其合并到 Mapstruct 中(我认为这是一个更糟糕的选择(:

@Mapping(target = "members", source = "members")
CasesDto toDto(CaseEntity entity, List<MemberEntity> members);

最新更新