Hibernate: найти дубликаты - PullRequest
       20

Hibernate: найти дубликаты

1 голос
/ 05 декабря 2009

Предположим, у меня есть следующий класс Groovy (или эквивалент в Java)

class User  {
    Long id
    String name
}

Я хотел бы написать запрос Hibernate (HQL или Criteria), который возвращает всех пользователей, у которых есть хотя бы один другой пользователь с таким же именем.

Обновление

Был предложен следующий запрос

select min(user.id), user.name
from User user
group by user.name
having count(user.name) > 1

Однако есть несколько проблем с этим:

  • На самом деле он не возвращает объекты пользователя, только их идентификатор и имя
  • Если есть 3 пользователя с одинаковыми именами, он вернет идентификатор только одного из них, тогда как я хочу, чтобы все 3
  • Может не работать на MySQL, который я использую в СУБД.

Спасибо, Дон

Ответы [ 3 ]

5 голосов
/ 05 декабря 2009

Я бы попробовал что-то вроде этого:

select min(user.id), user.name
from User user
group by user.name
having count(user.name) > 1

Обратите внимание, что согласно документации , функции SQL и агрегатные функции разрешены в предложениях using и order by, если они поддерживаются базовой базой данных (т. Е. Не в MySQL).

РЕДАКТИРОВАТЬ: Должно быть возможно получить пользователей с IN (хотя я не думаю, что производительность запроса будет очень хорошей):

from User u
where u.name IN (
select user.name
from User user
group by user.name
having count(user.name) > 1)
0 голосов
/ 06 января 2017
String hql = "select columnName form entityName";
Query query = session.createQuery(hql);
arrayList =   query.list();

int countOFRecords=Collections.frequency(arrayList , recordName)
0 голосов
/ 05 декабря 2009

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

Вы установили первичный ключ в своей таблице пользователей? Похоже, вы получаете дубликаты, потому что строка, по которой вы ищете, является первичным ключом. Hibernate требует, чтобы вы помещали первичные ключи в свои таблицы / объекты.

...