我对hibernate很陌生。我发现我们可以通过以下两种不同方式获得不同的结果。谁能告诉我他们之间有什么区别?什么时候可以使用一个?
Projections.distinct(Projections.property("id"));
与
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
虽然名称相似,但用法不同。
该语句将转换为SQL语句。它将被传递到DB Engine并作为SQL执行DISTINCT。看到:
DISTINCT
所以例如这个例子:
List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.distinct(Projections.property("id")) ) ) .list();
看起来像:
SELECT DISTINCT(cat_id) FROM cat_table
该语句是 事后 执行 的 。一旦返回了来自数据库引擎的SQL查询,Hibernate就会迭代结果集以将其转换为我们的实体列表。
但是是否总是需要它?不,大多数不需要。
唯一的情况是,如果必须在查询中使用关联,则必须使用它-JOINING one-to-manyend。
one-to-many
因为如果我们确实有一个 cat 和它的两个 kittens ,这将返回 2 行,而cat是 只有 一个:
cat
kittens
SELECT cat.*, kitten.* FROM cat_table as cat INNER JOIN kitten_table kitten ON kitten.cat_id = cat.cat_id
因此,末尾的语句criteriaQuery:
criteriaQuery
... // criteriaQuery joining root and some one-to-many .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
只会列出一只猫。