gpt4 book ai didi

hibernate - Criteria.DISTINCT_ROOT_ENTITY 与 Projections.distinct

转载 作者:行者123 更新时间:2023-12-03 07:15:48 27 4
gpt4 key购买 nike

我对 Hibernate 还很陌生。我发现我们可以使用以下两种不同的方式得到不同的结果。谁能告诉我它们之间有什么区别?何时使用其中一种而不是另一种?

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

对比

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

最佳答案

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

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

该语句将被翻译为 SQL 语句。它将传递到数据库引擎并作为 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 就会迭代结果集,将其转换为我们的实体列表。

但是总是需要它吗?不,大多数情况下不需要这样做。

The only case, when we MUST to use that, if there is an association in the query - JOINING the one-to-many end.

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

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)

将导致列表中只有一只猫。

关于hibernate - Criteria.DISTINCT_ROOT_ENTITY 与 Projections.distinct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536868/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com