Hibernate-HQL для извлечения коллекции из однонаправленных отношений 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;
    }
} 

обычно получение содержимого этого заказа просто:

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

но по какой-то причине я мог бы хотеть фильтровать свои результаты каким-то образом и извлекать только часть коллекции элементов, таких как все элементы больше, чем определенная цена, ниже определенного запаса и т. д. Самым быстрым способом (не возвращая затем все, а затем фильтруя впоследствии). Чтобы сделать это, я бы убежал. запрос HQL для извлечения элементов для определенного порядка и добавления некоторых материалов в предложение where или в объект запроса.

интуитивно я бы хотел, чтобы это поведение (что совершенно неправильно):

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

но, конечно, это неправильно, поскольку HQL работает с точки зрения сопоставленных объектов, поэтому я не могу использовать таблицу соединения в запросе. Так как же правильно это сделать?

Edit:

я нашел ответ на этот вопрос, я требуется следующий запрос:

Select o.items from Order o where o = ?

Это позволяет мне получить коллекцию элементов для заказа, без необходимости использовать двунаправленные отношения. Однако теперь я запутался на втором этапе этого вопроса, который заключается в том, как фильтровать результаты этой коллекции, самый простой пример:

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

который возвращает незаконную попытку разыменования коллекции, так как я буду фильтровать свои элементы?

Edit:

в решение билета на самом деле правильное, я неправильно истолковал решение изначально.

2 ответов


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

запросы HQL используют сущности и их ассоциации. Тот факт, что ассоциация использует таблицу объединения или нет, не важен для HQL: вы перемещаетесь по ассоциациям и Hibernate выполняет соответствующий перевод на SQL.


похоже, вы хотите отобразить другую сторону этого отношения, т. е. сделать это двунаправленное отображение.

затем вы можете использовать номер заказа в своем HQL:

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

из бумага HQL документация:

от кошки как кошка где кошка.приятель.id = 69 Запрос эффективен и не требует объединения таблиц.

тот факт, что вы пытаетесь сделать этот запрос предполагает, что отношения между линии и его порядок важен!