EclipseLink在SQL中生成笛卡尔计划而不是(内部)联接.为什么?

jav*_*ats 5 performance orm jpa eclipselink

在Hibernate是我的持久性提供程序的项目中,我可以使用'join fetch'表达式发出查询,而Hibernate将生成反映它的SQL:包含使用有效比较路径的连接表达式的SQL.

然而,EclipseLink以丑陋的笛卡尔计划发布SQL,这严重损害了性能.在阅读本文时,它提到急切的提取可能会产生笛卡儿计划,但它会方便地忘记其他提供程序(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 ";
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

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

小智 3

尝试使用:

@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

问候,

维克托·托托雷洛·内托