Hibernate - HQL для получения коллекции из однонаправленных отношений OneToMany - PullRequest
8 голосов
/ 24 ноября 2011

У меня есть класс с однонаправленным отношением один ко многим следующим образом:

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

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

Редактировать:

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

Ответы [ 2 ]

7 голосов
/ 24 ноября 2011
select item from Order order
inner join order.items item
where order = :order
and ...

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

3 голосов
/ 24 ноября 2011

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

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

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

Из документации по HQL :

от Cat as cat, где cat.mate.id = 69 Запрос эффективен и не требует объединения таблиц.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...