2009-12-04 81 views
1

假设我有以下的Groovy类(或Java中的等价物)休眠:找到重复

class User { 
    Long id 
    String name 
} 

我想编写一个Hibernate查询(或HQL或条件),返回所有具有在用户至少有一个同名的其他用户。

更新

下面的语句已经提出

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

然而,有几个问题是:

  • 实际上它并不返回用户对象,只是他们的ID和名称
  • 如果有3个用户具有相同的名称,它只会返回其中一个的ID,而我希望全部3
  • 它可能无法在MySQL上使用,这是我正在使用的RDBMS。

谢谢, 唐

回答

5

我想尝试这样的事:

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

需要注意的是,根据the documentationSQL函数和聚合函数的HAVING和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

+1我刚才说的,但你更快地到了那里。 – 2009-12-04 22:29:45

+1

虽然这不会正常工作,但您需要min(user.id),因为user.id不包含在组中 – 2009-12-04 22:30:54

+0

@Reverend Oops,没错。感谢您指出了这一点。 – 2009-12-04 23:07:38

-1

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

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

+0

是的,我在桌子上有一个主键,'Long id'字段可能是什么? – 2009-12-06 06:24:48

+0

我不能添加评论或投票,但我写了一个快速测试来测试Pascal Thivent解决方案,它对我使用MySQL 5.1.14和Hibernate 3.3.2.GA.该解决方案应该适合你。 – ralph 2009-12-06 23:53:33

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

int countOFRecords=Collections.frequency(arrayList , recordName)