5

在 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 ";

这是 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

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

4

2 回答 2

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

问候,

维克多·托托雷洛·内托

于 2011-02-22T19:12:09.620 回答
0

我不确定你是什么意思?SQL 似乎是正确的,每个表都有一个连接,哪个表缺少连接?

您期望的 SQL 是什么?

如果您的意思是将连接条件放在 FROM 子句而不是 WHERE 子句中,EclipseLink 会根据需要对外部连接执行此操作,但不会对内部连接执行此操作,因为它对我所知道的任何数据库都没有影响。如果您真的想要,您可以配置 EclipseLink 2.4 以使用 DatabasePlatform setPrintInnerJoinInWhereClause(false) API 在 FROM 子句中打印内部连接的连接条件,但它应该不会影响数据库的功能。

讨论连接获取笛卡尔问题的博客文章是,当您连接获取多个 1-m 关系时,这可能会导致返回大量数据。由于您需要所有数据,因此无法通过连接获取来优化这一点。在 EclipseLink 中,您可以使用批量提取,这比连接提取更有效。

见, http://java-persistence-performance.blogspot.com/2010/08/batch-fetching-optimizing-object-graph.html

于 2012-08-01T13:23:25.993 回答