Как сопоставить простой результат соединения Hibernate с объектом с подобъектами? - PullRequest
1 голос
/ 15 октября 2011

Я не понимаю, как запросить список объектов с подобъектами в нем.

У меня есть два класса Execution и Order.И в Execution у меня есть объект заказа в виде отношения один-к-одному:

public class Execution {
    private long id;
    private Order order;
    ...

В файле Execution.hbm.xml я настроил Order как много-к-одному с уникальным= "true".

<class name="Execution" table="executions">
    <id name="executionId" type="long">
        <generator class="native" />
    </id>
    <many-to-one name="Order" unique="true" fetch="join" class="Order" />
</class>

Обычно мы запрашиваем объекты Execution с помощью HibernateDAOSupport, используя:

List<Execution> executions = getHibernateTemplate().find("from Execution");

При наличии вышеуказанного отношения как мы можем запросить его и где я могу найтибольше информации о сохраняющихся объектах для сложных объединений?Я пытался:

List<Execution> list = getHibernateTemplate().find("from Execution e left outer join e.order");

Но он дает ClassCastException, так как запрос, похоже, не возвращает объекты Execution с дополнительными деталями заказа в объекте Order в Execution.

Что-то не такс отображением?Или запрос?

Большое спасибо за любые указатели!

- обновление

Извините за то, что вы нуб.Видимо первый запрос работает.Прочитав тонны документации по HQL, они не поняли достаточно об этом.Любая лучшая документация будет полезна.Спасибо ...

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

Это не сработает, потому что вы явно не говорите, что хотите, чтобы в вашем результате были только сущности исполнения.Он не может понять это, потому что объединение с сущностью order также приводит к тому, что атрибуты Order будут частью результата.

List<Execution> list = getHibernateTemplate().find(
    "from Execution e left outer join e.order");

Просто добавьте select, и он будетотлично работает:

List<Execution> list = getHibernateTemplate().find(
    "select e from Execution e left outer join e.order");

Но имеет ли смысл иметь такой запрос, это другой вопрос, в общем случае вам не нужно делать объединения в запросах для заполнения атрибутов отношений.Их заполнение контролируется установкой стратегии выборки на LAZY / EAGER или в зависимости от значений по умолчанию.

В вашем случае порядок должен существовать в запросе только в том случае, если

  1. вы хотите ограничить результаты запроса некоторым атрибутом по порядку (в таком случае вы также можете избежать JOIN в вашем HQLзапросить и просто перейти по пути: e.order.id = 2) или
  2. отношение к заказу является ленивым, и вы просто хотите убедиться, что заказ получен:

    Список списка= getHibernateTemplate (). find ("от выполнения e левая внешняя выборка соединения e.order");

0 голосов
/ 15 октября 2011

@ Микко и @ JB ответ / комментарии верны. Чтобы запросить подчиненный объект, просто измените строку

List<Execution> list = getHibernateTemplate().find(
"select e from Execution e left outer join e.order");

до

List<Execution> list = getHibernateTemplate().find(
"select e from Execution e left outer join e.order as o where o.id = ?");
...