В проектах, где 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
С наилучшими пожеланиями,
Родриго Хартманн