2009-12-04 92 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)