如何在Hibernate Criteria中添加Distinct

时间:2012-05-24 05:39:11

标签: java hibernate

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

        Criteria crit = session.createCriteria(Test.class);

    final ResultTransformer trans = new DistinctRootEntityResultTransformer();
    crit.setResultTransformer(trans);
    List rsList = trans.transformList(crit.list());

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

8 个答案:

答案 0 :(得分:24)

使用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<YourBean>

答案 1 :(得分:14)

尝试使用:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

它非常适合我

答案 2 :(得分:4)

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

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();

答案 3 :(得分:1)

遇到同样的问题,最后使用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();

答案 4 :(得分:1)

尝试使用:

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

答案 5 :(得分:0)

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

Hibernate: Parent and Child relationship data structure

答案 6 :(得分:0)

尝试

setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

Criteria crit = session.createCriteria(Test.class);

List list = crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

答案 7 :(得分:0)

尝试使用:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

它使用默认的哈希码来查找结果中的匹配项。

谢谢。