2013-12-18 69 views
1

我想獲得重複的條目。我想使用查詢作爲條件,爲此我使用下面的代碼。休眠標準找到重複

SELECT * from A 
WHERE field in (
    SELECT field from A 
    GROUP BY field HAVING COUNT(field) > 1 
); 

Hibernate映射就像

@Entity 
class A{ 
    ... 
    private String field; 
    ... 
} 

如何,我收到了那些在「字段」列重複的名單?

回答

2

您幾乎可以將您的查詢翻譯成一個到HQL(警告:未經測試)。 ,根據

select A 
from A a 
where a.field in (
    select ai.field 
    from A ai 
    group by ai.field -- assumes that by f you mean field 
    having count(a1.field) > 1 
) 
+0

我想建立在Java代碼中,不完全是標準的HQL –

+3

我會跟進這個問題:「爲什麼它必須是一個條件查詢?」 (如果答案是「因爲這是我的項目的其他方法所使用的」,請不要打擾,這不是一個好理由)。無論如何,如果你想遵守標準,請記住,你將被迫寫出比HQL版本更長,更難以閱讀和更慢的查詢。原因是hibernate標準不支持having子句。雖然有[已知的解決方法](http://fokot.blogspot.com.br/2011/06/having-clause-in-hibernate-criteria-no.html),我會明確地做到這一點與HQL。 –

+0

另外,看看休眠[補丁HHH-1043 - 添加了對標準的支持](https://hibernate.atlassian.net/browse/HHH-1043)自2005年10月開放。 –

1

我自己的答案提示Anthony Accioly

final Criteria searchCriteria = session.createCriteria(A.class); 

... 

final DetachedCriteria d1 = DetachedCriteria.forClass(A.class); 
d1.setProjection(Projections.count("field")); 
d1.add(Restrictions.eqProperty("field", "AA.field")); 

final DetachedCriteria d2 = DetachedCriteria.forClass(A.class, "AA"); 
d2.setProjection(Projections.projectionList() 
.add(Projections.groupProperty("field"))); 
d2.add(Subqueries.lt(1L, d1)); 

criteria.add(Property.forName("field").in(d2)); 
+0

很酷的解決方法('1其中1