我对Hibernate还是个新手。我发现用下面两种不同的方法可以得到不同的结果。谁能告诉我它们之间的区别是什么?什么时候使用一个超过另一个?
Projections.distinct(Projections.property("id"));
字符串vs
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
型
kqhtkvqz1#
虽然名称相似,但用法不同。
这个语句将被翻译成SQL语句。它将被传递到数据库引擎并作为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
此语句事后执行。一旦从DB引擎返回SQL查询,Hibernate迭代结果集,将其转换为我们的实体列表。但它总是需要的吗?不,大多数情况下,这是不需要的。唯一的情况下,当我们必须使用,如果有一个关联在查询- JOINING的one-to-many结束。因为如果我们有一个**cat和它的两个kittens,这将返回两行,而cat是only**one:
one-to-many
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)
型会导致一个只有一只猫的列表。
flvlnr442#
来自docs:DISTINCT_ROOT_ENTITY每一行结果都是根实体的一个不同示例distinct()选择distinct by属性,在本例中是通过标识符
2条答案
按热度按时间kqhtkvqz1#
虽然名称相似,但用法不同。
I.
Projections.distinct(Projections.property("id"));
这个语句将被翻译成SQL语句。它将被传递到数据库引擎并作为SQL
DISTINCT
执行。请参阅:例如,这个例子:
字符串
看起来像:
型
II.
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
此语句事后执行。一旦从DB引擎返回SQL查询,Hibernate迭代结果集,将其转换为我们的实体列表。
但它总是需要的吗?不,大多数情况下,这是不需要的。
唯一的情况下,当我们必须使用,如果有一个关联在查询- JOINING的
one-to-many
结束。因为如果我们有一个**
cat
和它的两个kittens
,这将返回两行,而cat
是only**one:型
因此,
criteriaQuery
结尾的语句:型
会导致一个只有一只猫的列表。
flvlnr442#
来自docs:DISTINCT_ROOT_ENTITY每一行结果都是根实体的一个不同示例
distinct()选择distinct by属性,在本例中是通过标识符