Русский English Тэги View Sergey Zolotaryov's profile on LinkedIn Вход
Дубликаты в Hibernate
Постоянная ссылка 09-04-2008 anydoby java

Замтели интересную особенность в Hibernate. Есть у меня таблица Product и у этого продукта может быть, допустим, несколько Image. В мэппингах Product.images отмечены как fetch=EAGER, то есть делаем JOIN. Если у продукта три картинки, то ResultSet будет содержать три почти одинаковых записи, отличающиеся только содержимым таблицы Image. По идее эти три записи должны схлопнуться в одну - объект Product и три его Image. Однако этого не происходит, если используется DetachedCriteria:


  DetachedCriteria criteria = DetachedCriteria.forClass(entityClass);
  criteria = criteria.addOrder(ascending ? Order.asc(orderBy) : Order.desc(orderBy));
  List<T> list = getHibernateTemplate().findByCriteria(criteria);

Список на выходе содержит 3(!!!) объекта Product с одинаковым id :)

Пришлось переписать этот запрос вот так:


  List find = getHibernateTemplate().find("from " + entityClass.getSimpleName()
             + " order by " + orderBy + " " + (ascending ? " asc " : " desc"));

Эта команда группирует результаты корректно.

Добавить комментарий

and_mail
16-05-2008

Чтобы этого не происходило при использовании Criteria, нужно писать

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY)

anydoby
16-05-2008

good point :)

anydoby
16-05-2008

Кстати, в конце концов все равно стал использовать нативные запросы, а Hibernate только как средство вытащить объект по id из кэша. Тут он рулит.

Предыдущая статья О борьбе с java.awt.HeadlessException Следующая статья Одно сообщение на поле в Spring MVC