一尘不染

Criteria.DISTINCT_ROOT_ENTITY与Projections.distinct

hibernate

我对hibernate很陌生。我发现我们可以通过以下两种不同方式获得不同的结果。谁能告诉我他们之间有什么区别?什么时候可以使用一个?

Projections.distinct(Projections.property("id"));

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

阅读 400

收藏
2020-06-20

共1个答案

一尘不染

虽然名称相似,但用法不同。

一世。 Projections.distinct(Projections.property("id"));

该语句将转换为SQL语句。它将被传递到DB Engine并作为SQL执行DISTINCT。看到:

所以例如这个例子:

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

看起来像:

SELECT DISTINCT(cat_id) FROM cat_table

二。 criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

该语句是 事后 执行 。一旦返回了来自数据库引擎的SQL查询,Hibernate就会迭代结果集以将其转换为我们的实体列表。

但是是否总是需要它?不,大多数不需要。

唯一的情况是,如果必须在查询中使用关联,则必须使用它-JOINING one-to-manyend。

因为如果我们确实有一个 cat 和它的两个 kittens ,这将返回 2 行,而cat只有 一个:

SELECT cat.*, kitten.*
FROM cat_table as cat 
  INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id

因此,末尾的语句criteriaQuery

... // criteriaQuery joining root and some one-to-many
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)

只会列出一只猫。

2020-06-20