Подтвердить что ты не робот

Действительно ли для списка Hibernate() возвращать дубликаты?

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

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

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

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

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria()
  .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
  .list();