如何在Hibernate Criteria中添加Distinct

在我的数据库中,我有一个Test表,列有:testName,testType有两个不同的测试,类型相同,即“SUN”,所以我只想要其中一个我在hibernate / criteria中使用Distinct,如下所示,它仍然给我两个与“太阳”同名的类型。

Criteria crit = session.createCriteria(Test.class); final ResultTransformer trans = new DistinctRootEntityResultTransformer(); crit.setResultTransformer(trans); List rsList = trans.transformList(crit.list()); 

任何想法可能是什么原因,或任何其他方式过滤重复。

使用Projections.distinct。

 Criteria crit = session.createCriteria(Test.class).setProjection( Projections.distinct(Projections.projectionList() .add(Projections.property("type"), "type") ) .setResultTransformer(Transformers.aliasToBean(YourBean.class)); List lst = crit.list(); 

其中YourBean.class具有属性“type”。 返回的列表将是List

尝试使用:

 cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

它对我来说很完美

我终于找到了获取其他列的值:

 Criteria criteria = session.createCriteria(Test.class); ProjectionList projectionList = Projections.projectionList(); ProjectionList projectionList2 = Projections.projectionList(); projectionList2.add(Projections.distinct(projectionList.add(Projections.property("distinctColumn"), "distinctColumn"))); projectionList2.add(Projections.property("col1"), "col1"); projectionList2.add(Projections.property("col2"), "col2"); criteria.setProjection(projectionList2); criteria.setResultTransformer(Transformers.aliasToBean(Test.class)); List list = criteria.list(); 

有同样的问题,最后使用Group By投影解决,然后添加我需要的所有列。 例如

 Criteria query = session.createCriteria(Class.class) .setProjection(Projections.projectionList() .add(Projections.groupProperty("Col1"), "Col1") .add(Projections.groupProperty("Col2"), "Col2")) .setResultTransformer(Transformers.aliasToBean(Class.class)); List list = query.list(); 

尝试使用:

 Criteria criteria = session.createCriteria(Test.class).setProjection( Projections.distinct(Projections.property("testType"))); List rsList = criteria.list(); 

预测仅提供标记属性的结果。 但是,它会给子实体带来问题。 查看我的post,了解我遇到的真正问题。

Hibernate:父子关系数据结构

尝试使用setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

Criteria crit = session.createCriteria(Test.class); 列表list = crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();