2011-11-24 13 views
8

Mam klasę z jednokierunkowego jeden do wielu relacji, co następuje:Hibernate - HQL sprowadzić kolekcję ze stosunku Jednokierunkowy OneToMany

public class Order { 
    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="order_item", joinColumns={@JoinColumn(name="order_id")}, inverseJoinColumns={@JoinColumn(name="item_id")}) 
    public Set<Item> getItems() { 
     return items; 
    } 
} 

Normalnie coraz zawartość tego celu jest prosta:

List<Item> items = order.getItems(); 

Ale z jakiegokolwiek powodu mogę chcieć odfiltrować moje wyniki w jakiś sposób i odzyskać tylko część kolekcji przedmiotów, takich jak wszystkie przedmioty powyżej określonej ceny, poniżej określonego zasobu itp. W najszybszy możliwy sposób (Nie wracając wtedy wszystkie następnie filtrowanie). Aby to zrobić, uruchomiłbym kwerendę HQL, aby pobrać elementy dla określonego zamówienia i dodać trochę więcej rzeczy do mojej klauzuli where lub do mojego obiektu zapytania.

Intuicyjnie chciałbym tego zachowania (co jest całkowicie błędne):

SELECT jointable.ITEM from order_item as jointable inner join jointable.order where order = :order 

Ale oczywiście to jest złe jak HQL działa w zakresie odwzorowanych jednostek, więc nie mogę użyć tabeli dołączyć w zapytaniu. Więc jaki jest właściwy sposób, aby to zrobić?

Edit:

znalazłem odpowiedź na to pytanie, chcę następujące zapytanie:

Select o.items from Order o where o = ? 

To pozwala mi pobrać zbiór elementów do zamówienia, bez konieczności użyj relacji dwukierunkowej. Teraz jestem jednak mylić na drugim etapie tej kwestii, która jest jak filtrować wyniki tej kolekcji, najbardziej Prostym przykładem jest:

Select o.items from Order o where o = ? order by o.items.somenumberfield asc 

Które zwraca nielegalną próbę kolekcji dereference, tak jak bym filtrować moje rzeczy?

Edit:

Rozwiązanie Bilet jest rzeczywiście słuszne, ja misread rozwiązanie pierwotnie.

Odpowiedz

6
select item from Order order 
inner join order.items item 
where order = :order 
and ... 

Zapytania HQL używają podmiotów i ich powiązań. Fakt, że skojarzenie używa tabeli sprzężenia, nie ma znaczenia dla HQL: nawigujesz przez asocjacje, a Hibernate wykonuje odpowiednie tłumaczenie na SQL.

+0

dziękuję za pomoc, zobacz moją edycję – mogronalol

3

Wygląda na to, że chcesz odwzorować drugą stronę tej zależności, tzn. Utworzyć to dwukierunkowe mapowanie.

Następnie można użyć numeru zamówienia w HQL:

from Item as item where item.amount > :amount and item.order.id = :orderId 

Z HQL documentation:

od Cat jak kot gdzie cat.mate.id = 69 Kwerenda jest skuteczny i nie wymaga przyłączenia stołu.

Fakt, że próbujesz wykonać to zapytanie sugeruje, że związek między Linią a jej Kolejnością jest ważny!

+1

Nie trzeba tworzyć powiązania dwukierunkowego. Zobacz moją odpowiedź. –

+0

Nie musisz. To nie znaczy, że nie powinieneś. Dokumenty Hibernate wyjaśniają, że HQL dla tej instancji jest zoptymalizowany do sytuacji, w której zmapowałeś obie strony. –

+0

dziękuję za pomoc, zobacz moją edycję – mogronalol

Powiązane problemy