Как я могу получить несколько лениво загруженных списков OneToMany? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть сущность с несколькими однонаправленными отношениями OneToMany, как показано ниже. Как я могу получить все эти поля в один запрос ? Что было бы лучшим способом, если бы у меня было до 10 Arraylists с отношением OneToMany?

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

Я попытался выполнить следующий шаг в своем классе 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

Затем я попытался выполнить следующий шаг с этой информацией 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);
    }

Спасибо за вашу помощь / подсказки!

1 Ответ

1 голос
/ 18 марта 2020

Попробуйте использовать 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<>();
...