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 Запрос эффективен и не требует объединения таблиц.
тот факт, что вы пытаетесь сделать этот запрос предполагает, что отношения между линии и его порядок важен!