gpt4 book ai didi

java - Mapstruct 多对一映射

转载 作者:行者123 更新时间:2023-12-01 14:33:09 24 4
gpt4 key购买 nike

我对 mapstruct 中的 @ManyToOne 映射有疑问。我有两张 table

第一个:

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

和 MemberDto 同为实体。

我需要像这样使用 mapstruct 进行映射:
CasesDto mapToDto(CaseEntity entity);

我需要填写 List 成员;但我无法理解如何。

最佳答案

您不能简单地以这种方式将其映射到 CasesDto。没有要映射到 List<MemberDto> 的集合.
您应该拥有完整的 CaseEntity,其中包括:

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

为了避免最坏的 N+1 问题( stackOverflow N+1 ),您应该正确配置 JPA(短 spring .yml 示例),这将允许您拥有 1 + Math.ceil({MembersAmount}/{default_batch_fetch_size}) ORM 执行的查询:
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);

关于java - Mapstruct 多对一映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59333845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com