Критерии гибернации с ассоциацией один ко многим - PullRequest
2 голосов
/ 12 сентября 2011

У меня есть объект Order (который, ну, в общем, представляет заказ), и у каждого заказа есть набор DeliveryDates. Я пытаюсь реализовать функцию поиска и показать результаты в JFace TableViewer.

Я хочу, чтобы для каждого заказа, имеющего более одной даты доставки, он дублировался в таблице, но в столбце DeliveryDate будет отображаться конкретная дата доставки для этого экземпляра.

Этот запрос легко выполняется в SQL с помощью простого объединения, и строки дублируются с различной датой для каждой строки. Поскольку я выполняю функцию поиска, я строю запрос поэтапно (в зависимости от того, какие параметры поиска выбрал пользователь), поэтому создание запроса с использованием критериев очень полезно. Проблема в том, что список результатов, который я получаю, дублируется (что нормально), но каждая сущность просто содержит один и тот же набор DeliveryDates - поэтому я не могу напечатать другую дату для разных строк одного и того же Ордена.

Есть ли способ сделать это с помощью Critera? А если нет, то как я могу это сделать?

Редактировать : Редактировать: Например, этот HQL-запрос выглядит примерно так: «выберите dd.deliveryDate, od из Order as od left join od.deliveryDates dd»

Ответ : Я нашел решение:

    Criteria crit = session.createCriteria(Order.class)
            .createAlias("deliveryDates", "dd")
            .setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);    

Я дал псевдоним коллекции deliveryDates и использовал ResultTransformer, чтобы возвращать результаты на карте. Список результатов поиска будет содержать карты с двумя ключами: «this» (он же Criteria.ROOT_ALIAS) и «dd». Это даст мне дублирование строк, которое я хотел, и теперь я могу получить соответствующие объекты следующим образом:

        Map map = (Map) element;
        Order ord = (Order) map.get(Criteria.ROOT_ALIAS);
        DeliveryDate dd = (DeliveryDate) map.get("dd"); 

Ответы [ 2 ]

0 голосов
/ 12 сентября 2011

Еще один подход к достижению того, что вы хотите в сценарии one to many, - это построение критериев на «многих» концах отношений.

Criteria crit = session.createCriteria(DeliveryDate.class);
...

DeliveryDate dd = (DeliveryDate) element; 
Order ord = dd.getOrder();
0 голосов
/ 12 сентября 2011

причина дублирования записей (с одинаковыми данными) заключается в том, что результирующие строки (дубликаты) имеют один и тот же первичный ключ и обрабатываются одинаково в спящем режиме.

В качестве решения необходимо убедиться, что PK рассчитывается по-разному для каждой записи (попробуйте использовать проекции здесь).

также HQL может быть более легким выбором (обычно я бы предпочел HQL в подобных сценариях).

Лучшее решение: если вы можете преобразовать запрос (по крайней мере, его часть) в представление и извлечь из него данные, тогда большинство проблем будет решено, и это будет лучший дизайн.

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