26

在我的数据库中,我有一个测试表,其中包含列:testName、testType 有 2 个具有相同类型的不同测试,即“SUN”,所以我只想要其中一个,我在我的休眠/标准中使用 Distinct,如下所示,但是它仍然给了我与“太阳”同名的两种类型。

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

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

知道可能是什么原因,或者任何其他过滤重复项的方式。

4

8 回答 8

31

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

where YourBean.class has a property "type". The returned list will be List<YourBean>.

于 2012-05-24T05:55:49.847 回答
23

尝试使用:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

它非常适合我

于 2015-05-21T14:56:06.533 回答
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();
于 2013-03-11T07:08:27.087 回答
4

尝试使用:

Criteria criteria = 
    session.createCriteria(Test.class).setProjection(
        Projections.distinct(Projections.property("testType")));
List<Test> rsList = criteria.list();
于 2017-05-05T09:29:23.437 回答
3

遇到了同样的问题,最终使用 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();
于 2013-03-06T22:36:57.380 回答
1

尝试

setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

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

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

于 2018-02-27T11:08:35.067 回答
0

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

Hibernate:父子关系数据结构

于 2014-01-22T22:51:09.293 回答
0

尝试使用:

criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);

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

谢谢。

于 2019-08-19T10:58:46.080 回答