在Hibernate是我的持久性提供程序的项目中,我可以使用'join fetch'表达式发出查询,而Hibernate将生成反映它的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
祝你好运, 罗德里戈哈特曼
答案 0 :(得分: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
此致
Victor Tortorello Neto
答案 1 :(得分:0)
我不确定你的意思? SQL似乎是正确的,每个表都有一个连接,哪个表缺少连接?
您期望的SQL是什么?
如果您的意思是将连接条件放在FROM子句而不是WHERE子句中,则EclipseLink会根据需要对外连接执行此操作,但不适用于内连接,因为它对我所知道的任何数据库都没有区别。如果您真的想要,可以使用DatabasePlatform setPrintInnerJoinInWhereClause(false)API配置EclipseLink 2.4以在FROM子句中打印内部联接的连接条件,但它应该对数据库的功能没有影响。
关于联接获取笛卡尔问题的博客文章是当您加入获取多个1-m关系时,这可能导致返回大量数据。由于您需要所有数据,因此无法使用连接提取对此进行优化。在EclipseLink中,您可以使用批量提取,这比连接提取更有效。
请参阅, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html