Jpa 如何获取多个延迟加载的OneToMany列表?

Jpa 如何获取多个延迟加载的OneToMany列表?,jpa,one-to-many,Jpa,One To Many,我有一个实体,有多个单向的一对一关系,如下所示。 如何在一次查询中获取所有这些字段? 如果我有多达10个ArrayList和一对一的关系,那么最好的方式是什么 @Data @EqualsAndHashCode(callSuper = true) @Entity @Table(name = "members") public class Member extends Auditable<String> { @Id @GeneratedValue(strategy =

我有一个实体,有多个单向的一对一关系,如下所示。 如何在一次查询中获取所有这些字段? 如果我有多达10个ArrayList和一对一的关系,那么最好的方式是什么

@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "members")
public class Member extends Auditable<String> {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Setter(AccessLevel.NONE)
    private Long id;

    @OneToOne
    private Gender gender;

    private String lastName;

    private String firstName;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id")
    private List<Phone> phoneList = new ArrayList<>();

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    @JoinColumn(name = "person_id")
    private List<EMail> eMailList = new ArrayList<>();

// more Lists with OneToMany relationship
}
@数据
@EqualsAndHashCode(callSuper=true)
@实体
@表(name=“成员”)
公共类成员扩展了Auditable{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE)
@Setter(AccessLevel.NONE)
私人长id;
@奥内托内
私人性别;
私有字符串lastName;
私有字符串名;
@OneToMany(cascade=CascadeType.ALL,orphanRemoving=true,fetch=FetchType.LAZY)
@JoinColumn(name=“person\u id”)
private List phoneList=new ArrayList();
@OneToMany(cascade=CascadeType.ALL,orphanRemoving=true,fetch=FetchType.LAZY)
@JoinColumn(name=“person\u id”)
private List eMailList=new ArrayList();
//更多具有“一对一”关系的列表
}
@数据
@EqualsAndHashCode(callSuper=true)
@实体
@表(name=“电子邮件”)
公共类电子邮件扩展了可审核的{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE)
@Setter(AccessLevel.NONE)
私人长id;
私有类型;
私有字符串值;
}
我在MemberRepository类中尝试了以下步骤,该步骤以MultipleBagFetchException结束:

@Query("SELECT m " +
            "FROM Member m " +
            "LEFT JOIN FETCH m.eMailList " +
            "LEFT JOIN FETCH m.phoneList " +
            "WHERE m.memberId = ?1")
Optional<Member> findByMemberIdWithAllInfoQuery(Long id);   // MultipleBagFetchException
@Query(“选择m”+
“来自成员m”+
“左加入获取m.eMailList”+
“左连接获取m.phoneList”+
“其中m.memberId=?1”)
可选FindByMemberWithAllInfo查询(长id);//多重回迁异常
然后,我尝试使用此信息执行以下步骤,但也无法正常工作:

public Optional<Member> findMemberWithAllFieldsQuery(Long memberId) {

        Member _member = entityManager.createQuery(
                "SELECT DISTINCT m " +
                        "FROM Member m " +
                        "LEFT JOIN FETCH m.eMailList " +
                        "WHERE m.memberId = :id ", Member.class)
                .setParameter("id", memberId)
                .setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false)
                .getSingleResult();

        _member = entityManager.createQuery(
                "SELECT DISTINCT m " +
                        "FROM Member m " +
                        "LEFT JOIN FETCH m.phoneList " +
                        "WHERE m in :member ", Member.class)
                .setParameter("member", _member)
                .setHint(QueryHints.HINT_PASS_DISTINCT_THROUGH, false)
                .getSingleResult();


        return Optional.of(_member);
    }
public可选findMemberWithAllFieldsQuery(长成员ID){
成员_Member=entityManager.createQuery(
“选择不同的m”+
“来自成员m”+
“左加入获取m.eMailList”+
“其中m.memberId=:id”,Member.class)
.setParameter(“id”,成员id)
.setHint(QueryHints.HINT\u PASS\u DISTINCT\u THROUGH,false)
.getSingleResult();
_成员=entityManager.createQuery(
“选择不同的m”+
“来自成员m”+
“左连接获取m.phoneList”+
“其中m在:成员”,成员类)
.setParameter(“成员”、_成员)
.setHint(QueryHints.HINT\u PASS\u DISTINCT\u THROUGH,false)
.getSingleResult();
返回可选。of(_成员);
}

谢谢你的帮助/提示

是否尝试使用Set而不是List?我遇到了此异常,并在将集合更改为Set后解决了它

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Set<Phone> phoneList = new HashSet<>();

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Set<EMail> eMailList = new HashSet<>();
@OneToMany(cascade=CascadeType.ALL,orphaneremovation=true,fetch=FetchType.LAZY)
@JoinColumn(name=“person\u id”)
private Set phoneList=new HashSet();
@OneToMany(cascade=CascadeType.ALL,orphanRemoving=true,fetch=FetchType.LAZY)
@JoinColumn(name=“person\u id”)
private Set eMailList=new HashSet();

我不知道这是否正确,但它救了我
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Set<Phone> phoneList = new HashSet<>();

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "person_id")
private Set<EMail> eMailList = new HashSet<>();