虽然名称相似,但用法不同。
一世。 Projections.distinct(Projections.property("id"));
该语句将转换为SQL语句。它将被传递到DB Engine并作为SQL执行
DISTINCT。看到:
- 17.9。投影,汇总和分组
所以例如这个例子:
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)
只会列出一只猫。



