【问题标题】:How does Criteria.DISTINCT_ROOT_ENTITY actually work?Criteria.DISTINCT_ROOT_ENTITY 实际上是如何工作的?
【发布时间】:2021-12-16 03:05:42
【问题描述】:

我目前正在尝试构建一个 SQL(纯 SQL,直接在数据库上执行 - 我没有特别为此使用 hibernate)来从我的数据库中获取数据。它是基于 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 中的 ID 列表(“someListofIDsFromPreviousQuery”)中产生 1-1 结果集,表 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 方言编写我的查询。

【问题讨论】:

    标签: java sql hibernate hibernate-criteria


    【解决方案1】:

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

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

    【讨论】:

    • 有人提醒我在 22 小时内将其设置为可接受的答案以确保完整性,请
    【解决方案2】:

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

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

    这是给出相同结果的预测

    criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
    

    【讨论】:

    • 我正在尝试使用普通 SQL 复制此功能,这与 java/hiberante 无关,除了这是我发现它的地方。查看我在问题中链接的 SO Answer,它已经解释了您在此处所说的内容。我对这些/那个休眠功能背后的机制很感兴趣。
    猜你喜欢
    • 2021-01-21
    • 2011-09-27
    • 2013-03-14
    • 2021-03-23
    • 2011-02-11
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多