У меня есть класс с однонаправленным отношением один ко многим следующим образом:
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
, который возвращает незаконную попытку разыменования сбора, так какЯ отфильтрую свои вещи?
Редактировать:
Решение для билета действительно правильное, изначально я неправильно его прочитал.