JPA pobranie encji z kolekcją i jej kolekcji

0

Mam encję Diet, która posiada kolekcje DietEntry, która to z kolei posiada dwie kolekcje: Products oraz Meals. Chciałbym pobrać encję Diet z kolekcją DietEntry i jej kolekcjami, jednak nie mogę pobrać DietEntry, ponieważ zawsze zwraca mi pusty zbiór. Próbowałem rozbić to na dwa zapytania i pobrać DietEntry i jej kolekcje w osobnym zapytaniu, lecz dostaję wciąż pusty zbiór.
Klasy:

public class Diet extends BaseEntity{
@NotEmpty
@Column(unique = true)
private String name;
@OneToMany(cascade=CascadeType.ALL, mappedBy = "diet")
@LazyCollection(LazyCollectionOption.FALSE)
private List<DietEntry> dietEntry = new ArrayList<>();

@Entity
@Table(name = "diet_entry")
public class DietEntry extends BaseEntity{
@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name = "dietId")
private Diet diet;
@ManyToMany(cascade=CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<Meal> meals = new ArrayList<>();
@ManyToMany(cascade=CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<ProductQuantity> products = new ArrayList<>();

Zapytanie:

Query query = this.em.createQuery("SELECT distinct(de) FROM     DietEntry de join de.products dep join de.meals dem WHERE de.diet = :diet");
    query.setParameter("diet", diet);
    return query.getResultList();
1

Zacznij od zmiany join na left join

Przy okazji - radzę ograniczyć @LazyCollection(LazyCollectionOption.FALSE), bo będziesz miał problemy wydajnościowe. Jeżeli chcesz uniknąć problemu 1+n, to w zapytaniu rób "left join fetch".

1

@hcubyc zrób fetch join i zamień wszystkie List na Set. W ogóle czemu ludzie mają jakieś ciągoty do używania List kiedy ewidentnie powinni tam mieś Set... (to rozwiąże twój problem z multiple bags)

1 użytkowników online, w tym zalogowanych: 0, gości: 1