powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA (Hiber) CriteriaQuery: Eager Join or Fetch as Path
3 сообщений из 3, страница 1 из 1
JPA (Hiber) CriteriaQuery: Eager Join or Fetch as Path
    #38365692
Vladmir K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть связанные сущности, например Document -> Contract -> Contractor

Нужно отобрать все документы (Document) по имени Клиента (Contractor). При этом хочу сразу подгружать Контракт и Клиент (Eager).
Задача тривиальная. В JPQL для этого есть 'join fetch'. Загвоздка с CriteriaBuilder.

В документации Хибера есть пример :
Код: java
1.
2.
3.
4.
CriteriaQuery<Person> personCriteria = builder.createQuery( Person.class );
Root<Person> personRoot = person.from( Person.class );
Join<Person,Order> orders = personRoot.fetch( Person_.orders ); // fetch возвращает Join 
Join<Order,LineItem> orderLines = orders.fetch( Order_.lineItems );



У меня ошибка кастинга при компиляции (fetch - это не join):
Код: java
1.
Join<Document, Contract> c = root.fetch("contract", JoinType.LEFT);



Поэтому
Код: java
1.
Fetch<Document, Contract> c = root.fetch("contract", JoinType.LEFT);



Однако у Fetch нет метода get (Fetch не Path), чтобы потом в where добавить...
Увидел комментарий про Fetch тут
Caution should be used in using a Fetch in the where clause as it can affect the data returned for the resulting object's relationships. Objects should normally always have the same data, no matter how they were queried, this is important for caching and consistency. This is only an issue if the alias is used in the where clause on a collection relationship to filter the related objects that will be fetched. This should not be done, but is sometimes desirable, in which case the query should ensure it has been set to BYPASS the cache.
Согласен, но все же не основание, чтобы Fetch не расширял Path. Как его в where подсунуть?

Нашел такие примеры , где "рекомендуют" паралельно с Join (= Path) еще и написать отдельно Fetch. Но тогда появляются дополнительные join в SQL запросе, что IMHO, совсем неправильно.

Направьте на путь, пжста.
...
Рейтинг: 0 / 0
JPA (Hiber) CriteriaQuery: Eager Join or Fetch as Path
    #38366396
Vladmir K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели никто не использует QueryBuilder?

Поделитесь опытом: как критерии добавляете для связанных сущностей, а потом результат отдаете клиенту. Как решаете проблему N+1?
...
Рейтинг: 0 / 0
JPA (Hiber) CriteriaQuery: Eager Join or Fetch as Path
    #38366646
Vladmir K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вдруг кому-ть все же интересно:

Кастинг все же будет работать, если вместо вытаскивание атрибута по имени в .fetch(<атрибут>)
Vladmir KУ меня ошибка кастинга при компиляции (fetch - это не join):
Код: java
1.
Join<Document, Contract> c = root.fetch("contract", JoinType.LEFT);


использовать метаданные как в примере от Хибера:
Код: java
1.
Join<Document, Contract> c = root.fetch(Document_.contract, JoinType.LEFT);



SQL генерируется красивый. "Join c" становится полноценным Path и может использоваться в where, не генерируя дополнительные SQL cross join.

Всем спасибо
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / JPA (Hiber) CriteriaQuery: Eager Join or Fetch as Path
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]