【问题标题】:Hibernate: find duplicates休眠:查找重复项
【发布时间】:2009-12-04 22:16:56
【问题描述】:

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

但是,这样做存在一些问题:

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

谢谢, 唐

【问题讨论】:

    标签: java hibernate orm groovy hql


    【解决方案1】:

    我会尝试这样的:

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

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

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

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

    【讨论】:

    • 虽然这并不完全有效,但您需要 min(user.id) 因为 user.id 不包含在 group by 中
    【解决方案2】:
    String hql = "select columnName form entityName";
    Query query = session.createQuery(hql);
    arrayList =   query.list();
    
    int countOFRecords=Collections.frequency(arrayList , recordName)
    

    【讨论】:

      【解决方案3】:

      我假设您正在寻找与用户名完全匹配的字符串。此外,您希望 id 上的主键可以判断用户是否具有相同的名称但实际上是不同的用户。

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

      【讨论】:

      • 是的,我的桌子上有一个主键,Long id 字段还可能是什么?
      • 我还不能添加 cmets 或投票,但我写了一个快速测试来测试 Pascal Thivent 解决方案,它使用 MySQL 5.1.14 和 Hibernate 3.3.2.GA 对我有用。该解决方案应该适合您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2014-11-06
      • 1970-01-01
      • 2014-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多