У меня есть класс с однонаправленными отношениями «один ко многим» следующим образом:
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 работает с отображением сущностей, поэтому я не могу использовать таблицу соединений в запросе. Итак, как правильно это сделать?
Изменить:
Я нашел ответ на этот вопрос мне нужен следующий запрос:
Select o.items from Order o where o = ?
Это позволяет мне получить коллекцию товаров для заказа , без использования двунаправленной связи. Однако сейчас меня смущает второй этап этого вопроса, который заключается в том, как отфильтровать результаты этой коллекции, самый простой пример:
Select o.items from Order o where o = ? order by o.items.somenumberfield asc
Что возвращает незаконную попытку разыменования коллекции, так как мне отфильтровать свои элементы?
Редактировать:
Решение по заявке на самом деле правильное, я неправильно прочитал решение изначально.