hibernate Criteria.DISTINCT_ROOT_ENTITY实际上是如何工作的?

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

我目前正在尝试构建一个SQL(普通SQL,直接在数据库上执行--我没有特别使用Hibernate)来从数据库中获取数据。这是一个基于Java实现的(hibernate)条件查询的导出,我想从其他表中向该查询添加其他信息。
在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的ID列表的1-1结果集(“someListofIDsFromPreviousQuery”),其中在表B(“MyEntity.class”)中存在多个结果。
I know what DISTINCT_ROOT_ENTITY does,但我想知道它实际上是如何工作的,也就是说,一个等价的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 Dialect编写查询。

h7appiyu

h7appiyu1#

经过一些搜索、实验和一般的困惑-似乎DISTINCT_ROOT_ENTITY在如何确定表B中的值方面没有做出任何实际决策。它只是“随机”地从JOIN中获取结果集的第一个值。
因此,我试图作为SQL基础的代码实际上是错误的,对它所在的应用程序来说是危险的。很高兴知道 * 咳嗽 *

klsxnrf1

klsxnrf12#

我发现用下面两种不同的方法可以得到不同的结果

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

字符串
这是投影图,给出了与

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

相关问题