Допустимо ли в Hibernate list () возвращать дубликаты? - PullRequest
29 голосов
/ 13 октября 2009

Кто-нибудь знает о допустимости методов Criteria.list() и Query.list() Hibernate, возвращающих несколько вхождений одного и того же объекта?

Иногда при использовании API Criteria я обнаруживаю, что изменение стратегии выборки по умолчанию в моем определении сопоставления классов (с «select» на «join») иногда может повлиять на то, сколько ссылок на одну и ту же сущность может появиться в результирующем выводе list(), и я не уверен, следует ли рассматривать это как ошибку или нет. Javadoc не определяет его, он просто говорит «Список результатов сопоставленных запросов». (спасибо, ребята).

Если это ожидаемое и нормальное поведение, тогда я могу самостоятельно де-дуплицировать список, это не проблема, но если это ошибка, то я бы предпочел ее избежать, а не де-дуплицировать результаты и попытаться игнорируй это.

У кого-нибудь есть опыт?

Ответы [ 4 ]

23 голосов
/ 13 октября 2009

Да, получение дубликатов вполне возможно, если вы построите свои запросы так, чтобы это могло произойти. См. Например Hibernate CollectionOfElements EAGER извлекать дубликаты элементов

6 голосов
/ 26 августа 2016

Я также начал замечать это поведение в моем Java API, когда оно начало расти. Рад, что есть простой способ предотвратить это. Из практики я начал добавлять:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

По всем моим критериям, которые возвращают список. Например:

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria()
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .list();
4 голосов
/ 14 апреля 2010

Если у вас есть объект, у которого есть список подобъектов, и ваши критерии объединяют две таблицы вместе, вы можете получить дубликаты основного объекта.

Один из способов избежать дублирования - использовать DistinctRootEntityResultTransformer. Основным недостатком этого является использование буферизации набора результатов / подсчета строк. Два не работают вместе.

0 голосов
/ 13 ноября 2018

У меня была точно такая же проблема с Criteria API. Простое решение для меня состояло в том, чтобы установить отличное значение true в запросе, например

CriteriaQuery<Foo> query = criteriaBuilder.createQuery(Foo.class);
query.distinct(true);

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

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