java - 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 方言编写我的查询。
解决方案
经过一些搜索、试验和普遍混淆 - 似乎 DISTINCT_ROOT_ENTITY 没有对如何确定表 B 中的值做出任何实际决策。它只是“随机”地从 JOIN 中获取结果集的第一个值。
所以我试图建立我的 SQL 的代码实际上是错误的,并且对于它所在的应用程序来说是危险的。很高兴知道。咳嗽
推荐阅读
- reactjs - 旧版上下文 API 使用 react-router-dom 反应
- typescript - 如何让 typescript 对象属性接受数组(对象)或对象的联合?
- python - 如何在python中的对象数组上应用过滤器
- javascript - 使用 jQuery 显示/隐藏 div
- javascript - 如何将 API 数据解析为谷歌表格
- mysql - Upload Text File Containing Long List of Tags to WordPress
- mysql - 需要从服务器下载一组唯一编号以供本地使用
- sql - 如何在 Neo4j 中按不同的节点属性对节点进行分组并按不同的属性排序?
- python - 为什么我的函数对 LSTM 有很好的价值,但对 GRU 没有?
- python - TypeError: text must be unicode or bytes & how to make a working bullet in pygame