2013-12-18 37 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