如何在Hibernate Criteria中添加Distinct

use*_*162 18 java hibernate

在我的数据库中,我有一个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());
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ndy 27

使用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();
Run Code Online (Sandbox Code Playgroud)

其中YourBean.class具有属性"type".返回的列表将是List<YourBean>.

  • @Dandy,提供了很好的答案,但我仍然遇到问题.我得到的bean只包含"类型".Test类的其他属性具有null或0值.如何获取这些值以及唯一类型限制. (7认同)
  • 没有支架丢失吗? (2认同)

小智 16

尝试使用:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Run Code Online (Sandbox Code Playgroud)

它对我来说很完美

  • 这是非常有限的解决方案.使用ResultTransformer时,hibernate在SQL查询中不包含DISTINCT,因此我们遇到了分页问题(限制/偏移) (4认同)
  • 很好的答案,仅在另外 1 行(而不是 10 行...) (2认同)

RAS*_*RAS 5

我终于发现要获取其他列的值:

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();
Run Code Online (Sandbox Code Playgroud)