JPA pobranie encji z kolekcją i jej kolekcji

Odpowiedz Nowy wątek
2015-01-20 19:17
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();

Limitations are limitless

> ##### Ola Nordmann napisał(a)
> Moim językiem ojczystym jest C++ i proszę uszanować to, że piszę po polsku.

Pozostało 580 znaków

2015-01-20 19:34
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".


Registered Linux user #456405 | SCJP 6 | SCWCD 5 | SCBCD 5
edytowany 1x, ostatnio: __krzysiek85, 2015-01-20 19:37
Przy użyciu left join fetch dostaję error: cannot simultaneously fetch multiple bags ; przy użyciu left join i fetch type lazily: failed to lazily initialize a collection of role: model.DietEntry.products, could not initialize proxy - no Session, przy eager dostaję NPE gdy chcę pobrać produkty z DietEntry - hcubyc 2015-01-20 19:49

Pozostało 580 znaków

2015-01-20 22:59

@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)


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 1x, ostatnio: Shalom, 2015-01-20 22:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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