gpt4 book ai didi

orm - EclipseLink 生成笛卡尔计划而不是 SQL 中的(内部)联接。为什么?

转载 作者:行者123 更新时间:2023-12-03 03:17:28 27 4
gpt4 key购买 nike

在 Hibernate 是我的持久性提供者的项目中,我可以使用“join fetch”表达式发出查询,Hibernate 将生成反射(reflect)该内容的 SQL:包含使用有效比较路径的联接表达式的 SQL。

然而,EclipseLink 使用丑陋的笛卡尔计划发出 SQL,这严重损害了性能。在阅读本文时article ,它提到急切地获取可能会生成笛卡尔计划,但它很容易忘记其他提供者(Hibernate)可以优化它。

那么,是否可以指示 EclipseLink 优化这些查询?我相信很少有关系可以通过使用 @FetchJoin 注释来优化,但我希望找到一些不包括在域模型上传播 ORM 特定注释的东西。

作为示例,下面是我作为 JPQL 发出的(动态)查询:

String query = "select w from WorkOrder w " +
"inner join fetch w.type " +
"inner join fetch w.details " +
"inner join fetch w.project " +
"inner join fetch w.priority " +
"inner join fetch w.networkElement ";

这是 EclipseLink 输出:

SELECT t1.ID, t1.CREATION, ... (the fetch fields here)
FROM swa_network_element t5, swa_priorities t4, swa_dispatch_project t3, swa_work_order_detail t2, swa_work_orders t1, swa_work_order_type t0
WHERE ((t1.alpha_id LIKE '%TSK%') AND (((((t0.ID = t1.TYPE_ID) AND (t2.worder_id = t1.ID)) AND (t3.id = t1.project_id)) AND (t4.ID = t1.priority_id)) AND (t5.ID = t1.ne_id))) ORDER BY t1.CREATION DESC

最诚挚的问候,罗德里戈·哈特曼

最佳答案

尝试使用:

@org.eclipse.persistence.annotations.JoinFetch(JoinFetchType.INNER)

-- 或 --

@org.eclipse.persistence.annotations.JoinFetch(JoinFetchType.OUTER)

对于可为空的列,建议使用外部联接。

我在此博客中找到了更多信息:http://vard-lokkur.blogspot.com/2010/09/jpa-demystified-episode-1-onetomany-and.html

问候,

维克托·托托雷洛·内托

关于orm - EclipseLink 生成笛卡尔计划而不是 SQL 中的(内部)联接。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2455227/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com