Выборка несколько onetoMany отношений В спящем режиме JPA

Я использую, в спящем режиме JPA 1.0.

У меня есть следующий тип модели, и я считаю manyToOne и непосредственные отношения "нетерпеливо" выбранными и oneToMany "лениво" выбранный.

Я хочу выбрать Объект A и все его ассоциации где a.id =?

  • oneToMany B
    • B непосредственный C
      • C oneToMany D
    • B непосредственный E
      • E oneToMany D
    • B непосредственный F
      • F oneToMany D

Действительно ли возможно загрузить этот объект в едином запросе? Или в подмножестве запросов, обнажающих в памяти "n+1, выбирает проблему"!

До сих пор мое решение загрузки всего из ассоциации состояло в том, чтобы выполнить следующее:

"Выберите ОТЛИЧНЫЙ из ВЫБОРКА СОЕДИНЕНИЯ a.bs ГДЕ a.id =:aID"

И затем выполните итерации использующего кода для выборки всех других ассоциаций.

Набор B бакалавр наук = A.getBs ();

         for (final B b : bs) {
         b.getCs().getDs().size();
         b.getEs().getDs().size();
         b.getFs().getDs().size();
         }

Очевидно, должен быть лучший способ сделать это.

7
задан 21 October 2010 в 14:17
поделиться

1 ответ

Используйте FETCH JOIN. Из спецификации JPA 1.0:

4.4.5.3 Fetch Joins

FETCH JOIN позволяет получить ассоциацию как побочный эффект выполнения запроса. FETCH JOIN задается над сущность и связанные с ней сущности.

Синтаксис для fetch join следующий

fetch_join ::= [ LEFT [OUTER] | INNER ] JOIN FETCH join_association_path_expression

Ассоциация, на которую ссылается правая часть условия FETCH JOIN должна быть ассоциацией, которая принадлежит сущности, которая возвращается в результате запроса. Не разрешается указывать идентификационную переменную для сущностей, на которые ссылается правая правой части предложения FETCH JOIN, и следовательно, ссылки на неявно извлеченные сущности не могут появиться в других местах запроса.

Следующий запрос возвращает набор отделов. В качестве побочного эффекта соответствующие сотрудники этих отделов также извлекаются, даже хотя они не являются частью явного результата запроса. Постоянные поля или свойства сотрудников которые извлекаются с нетерпением, полностью инициализированы. Инициализация свойств отношений сотрудников, которые извлекаются, определяется определяется метаданными для класса сущности Employee.

SELECT d
FROM Департамент d LEFT JOIN FETCH d.employees
WHERE d.deptno = 1

Соединение с выборкой имеет ту же самую семантику, как и соответствующее внутреннее или внешнее соединение, за исключением того, что связанные объекты, указанные на правой стороне стороне операции присоединения не возвращаются в результате запроса или не возвращаются в результат запроса и не ссылаются на него. Таким образом, например, если в отделе 1 имеет пять сотрудников, то приведенный выше запрос возвращает пять ссылок на отдел 1.

Конечно, используйте это с умом, не соединяйте слишком много таблиц, иначе вы погубите производительность.

2
ответ дан 7 December 2019 в 05:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: