hibernate Criteria.DISTINCT_ROOT_ENTITY与Projections.distinct

qmelpv7a  于 2023-08-06  发布在  其他
关注(0)|答案(2)|浏览(71)

我对Hibernate还是个新手。我发现用下面两种不同的方法可以得到不同的结果。谁能告诉我它们之间的区别是什么?什么时候使用一个超过另一个?

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

字符串
vs

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

kqhtkvqz

kqhtkvqz1#

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

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

这个语句将被翻译成SQL语句。它将被传递到数据库引擎并作为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

II. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

此语句事后执行。一旦从DB引擎返回SQL查询,Hibernate迭代结果集,将其转换为我们的实体列表。
但它总是需要的吗?不,大多数情况下,这是不需要的。
唯一的情况下,当我们必须使用,如果有一个关联在查询- JOINING的one-to-many结束。
因为如果我们有一个**cat和它的两个kittens,这将返回行,而catonly**one:

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)


会导致一个只有一只猫的列表。

flvlnr44

flvlnr442#

来自docs:DISTINCT_ROOT_ENTITY每一行结果都是根实体的一个不同示例
distinct()选择distinct by属性,在本例中是通过标识符

相关问题