首页 > 解决方案 > Criteria.DISTINCT_ROOT_ENTITY 实际上是如何工作的?

问题描述

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

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

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

这会从表 A(“someListofIDsFromPreviousQuery”)中的 ID 列表中产生 1-1 结果集,表 B(“MyEntity.class”)中有多个结果。

我知道 DISTINCT_ROOT_ENTITY 做了什么,但我想知道它实际上是如何工作的,意思是等效的 SQL 会是什么样子?

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

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

返回 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;

返回 2500 个结果。

Critera.DISTINCT_ROOT_ENTITY 如何实际选择 TABLEB 的哪个条目作为其“独特实体”?或者我在这里有什么问题吗?

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

标签: javasqlhibernatehibernate-criteria

解决方案


经过一些搜索、试验和普遍混淆 - 似乎 DISTINCT_ROOT_ENTITY 没有对如何确定表 B 中的值做出任何实际决策。它只是“随机”地从 JOIN 中获取结果集的第一个值。

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


推荐阅读