JPA Ленивый выбор объектов на нескольких уровнях с критериями API - PullRequest
8 голосов
/ 09 января 2012

Я использую JPA2 с его Criteria API для выбора моих сущностей из базы данных.Реализация - OpenJPA на сервере приложений WebSphere.Все мои сущности смоделированы с помощью Fetchtype = Lazy.

Я выбираю сущность с некоторыми критериями из базы данных и хочу загрузить все вложенные данные из вложенных таблиц одновременно.Если у меня есть модель данных, в которой таблица A соединена oneToMany с таблицей B, я могу использовать предложение Fetch в своем запросе критериев:

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<A> cq = cb.createQuery(A.class);
Root<A> root = cq.from(A.class);
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT);

Это прекрасно работает.Я получаю элемент A, и все его элементы B заполнены правильно.Теперь таблица B имеет отношение oneToMany к таблице C, и я хочу загрузить их тоже.Поэтому я добавляю в свой запрос следующее утверждение:

Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT);

Но это ничего не сделает.

Кто-нибудь знает, как получить многоуровневые объекты в одном запросе?

1 Ответ

10 голосов
/ 15 января 2012

Он не работает с JPQL, и в CriteriaQueries нет способа заставить его работать. Спецификация ограничивает выбранные объекты теми, на которые ссылаются непосредственно из возвращенного объекта:

О получении соединения с CriteriaQuery:

Ассоциация или атрибут, на который ссылается метод выборки, должны быть ссылка на объект или встраиваемость, возвращаемая в результате запроса.

О получении соединения в JPQL:

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

Такое же ограничение также указано в документации OpenJPA.

...