Criteria.DISTINCT_ROOT_ENTITY 是如何运作的?

How does Criteria.DISTINCT_ROOT_ENTITY actually work?

我目前正在尝试构建一个 SQL(普通 SQL,直接在数据库上执行 - 我没有为此特别使用休眠)以从我的数据库中获取数据。它是基于 Java 实现的(休眠)条件查询的导出,我想向其中添加来自其他表的其他信息。

在Java条件查询中,我有如下语句:

Criteria criteria = session.createCriteria(MyEntity.class);
                criteria.createCriteria("fk").add(Restrictions.in("sysid", <<someListofIDsfromPreviousQuery>>))
                criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
                return criteria.list();

从 Table A ("someListofIDsFromPreviousQuery") 的 ID 列表中得到 1-1 结果集,Table B ("MyEntity.class").

I know what DISTINCT_ROOT_ENTITY does 但我想知道它 实际上是如何工作的 ,也就是说,等效的 SQL 会是什么样子?

根据上面的条件查询的例子:

SELECT COUNT(*) FROM TABLEA a 
WHERE a.property1=someValue AND a.property2=someOtherValue;

Returns 2000 个结果。 (这是我的 ID 列表)

SELECT COUNT(*) FROM TABLEA a
JOIN TABLEB b ON b.fk = a.sysid -- <-- this is basically equivalent to what the criteria query above does, no?
WHERE a.property1=someValue AND a.property2=someOtherValue;

Returns 2500 个结果。

Critera.DISTINCT_ROOT_ENTITY实际上是如何选择 TABLEB 的哪个条目作为其“独立实体”的?还是我这里有问题?

如果它有所作为:我正在尝试在 OracleDB SQL 方言中编写我的查询。

我发现我们可以使用以下两种不同的方式得到不同的结果

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

这是给出与

相同结果的投影
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

经过一些搜索、试验并普遍感到困惑 - 似乎 DISTINCT_ROOT_ENTITY 没有就如何确定 Table B 的值做出任何实际决策。它只需要第一个“随机”加入的结果集的值。

所以我试图作为我的 SQL 基础的代码实际上是错误的,并且对于它所在的应用程序来说是危险的。很高兴知道。 咳嗽