Критерии гибернации: Вернуть другой тип сущности, чем корневая сущность? - PullRequest
2 голосов
/ 07 апреля 2010

У меня есть лица, похожие на:

ProductLine: id, name
ProductLineContents: content_id, product_line_id
Content: id, text, updated_time

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

select content.* from productline 
inner join productlinecontents
inner join content;

Однако я не могу понять, как заставить Hibernate Criteria возвращать объект, отличный от исходного, с которым он был создан. Поэтому, если я хочу начать критерии в линейке продуктов с createCriteria(ProductLine.class) вместе с правильными соединениями, то он возвращает только ProductLine объектов, но мне нужно Content объектов.

Какой лучший способ сделать это?

Фактическая модель данных намного сложнее и не может быть изменена

Ответы [ 2 ]

1 голос
/ 09 апреля 2010

Карта ALIAS_TO_ENTITY_MAP сработала:

criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
List itemsList = criteria.list();

if (itemsList == null || itemsList.isEmpty()) {
    throw new EntityNotFoundException();
}

List<Content> content = new ArrayList<Content>();
Iterator iter = itemsList.iterator();
while ( iter.hasNext() ) {
    Map map = (Map) iter.next();
    content.add((Content) map.get("contentAlias"));
}

return content;
1 голос
/ 07 апреля 2010

Или вы могли бы сделать так http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#querycriteria-associations

Использовать псевдоним преобразователя результатов для объекта карты

Но Hql кажется наиболее подходящим для использования.

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