【问题标题】:How can I fetch multiple lazy loaded OneToMany lists?如何获取多个延迟加载的 OneToMany 列表?
【发布时间】:2020-06-29 10:59:36
【问题描述】:

我有一个具有多个单向 OneToMany 关系的实体,如下所示。 如何在一个查询中获取所有这些字段? 如果我有多达 10 个具有 OneToMany 关系的 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
}
@Data
@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "emails")
public class EMail extends Auditable<String> {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Setter(AccessLevel.NONE)
    private Long id;
    private Type type;
    private String value;
}

我尝试了在以 MultipleBagFetchException 结尾的 MemberRepository 类中执行以下步骤:

@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

然后我尝试使用此信息https://vladmihalcea.com/hibernate-multiplebagfetchexception/ 执行以下步骤,但也无法正常工作:

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

感谢您的帮助/提示!

【问题讨论】:

    标签: jpa one-to-many


    【解决方案1】:

    尝试使用 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<>();
    

    【讨论】:

    • 我不知道这是否正确,但它救了我
    猜你喜欢
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多