Hibernate选择distinct返回唯一的id

时间:2018-03-23 14:55:30

标签: hibernate distinct hibernate-criteria

class Cat {
    long id;
    String name;
    int age
}

List<Cat> results = (List<Cat>) session.createCriteria(Cat.class)
    .setProjection( Projections.projectionList()
        .add( Projections.distinct(Projections.property("id")) )
    )
    .list();

在没有设置投影的情况下它完美地工作,但是由id重复。 当我们添加set projection时,查询只返回一个列表,如果是id(1,2,3)。

如何更改以返回猫和非重复ID的列表?

https://hibernate.atlassian.net/browse/HHH-12437

1 个答案:

答案 0 :(得分:1)

一种选择是在条件对象上使用setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)。但它不是在数据库方面实现的 - 它是以程序方式过滤的(在数据库查询被触发后,Hibernate会过滤不同的行)。

另一个更好的选择是使用setResultTransformer(new AliasToBeanResultTransformer(Cat.class)),您需要使用与上述不同的投影,并且还要对要在Cat实体中填充的所有属性进行投影。这在SQL查询中使用了distinct关键字,因此在DB中进行过滤

您可以查看此hibernate forum - select distinct entities using Criteria以获取有关相关讨论的示例和更多信息。