Hibernate:找到重复项

时间:2009-12-04 22:16:57

标签: java hibernate orm groovy hql

假设我有以下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

然而,这有一些问题:

  • 它实际上并不返回User对象,只是它们的id和名称
  • 如果有3个用户名相同,则只返回其中一个用户的ID,而我想要全部3个
  • 它可能不适用于MySQL,这是我正在使用的RDBMS。

谢谢, 唐

3 个答案:

答案 0 :(得分:5)

我会尝试这样的事情:

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

请注意,根据the documentation,如果底层数据库支持(即不在MySQL中),则在having和order by子句中允许使用 SQL函数和聚合函数。

编辑:应该可以检索具有IN的用户(我不认为查询性能会非常好):

from User u
where u.name IN (
select user.name
from User user
group by user.name
having count(user.name) > 1)

答案 1 :(得分:0)

String hql = "select columnName form entityName";
Query query = session.createQuery(hql);
arrayList =   query.list();

int countOFRecords=Collections.frequency(arrayList , recordName)

答案 2 :(得分:-1)

我认为您正在寻找用户名的精确字符串匹配。此外,您还需要id上的主键,以便您可以判断用户是否具有相同的名称,但实际上是另一个用户。

您是否在User表上设置了主键?听起来你正在获得重复,因为你正在搜索的字符串是主键。 Hibernate要求您将主键放在表/对象上。