我对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;
}
而且我有一个这样的案例dto:
public class CasesDto{
protected Long id;
protected String description;
private List<MemberDto> members;
}
并且MemberD与实体相同。
我需要使用mapstruct进行这样的映射:
CasesDto mapToDto(CaseEntity entity);
而且我需要填写列表成员;但我不明白如何。
您不能仅以此方式将其映射到CasesD。没有要映射到List<MemberDto>
的集合。您应该完全组成包括以下内容的CaseEntity:
@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);