2015-01-06 6 views
2

Я знаю, что такое соединения и как их использовать в простом SQL, но я не могу найти никакого объяснения Интернета для запроса объекта с отношениями. Я использую entity, getList.size() для запроса объектов, у которых есть одна ассоциация ToMany или ManyToMany с моей сущностью. Мне интересно, есть ли способ запросить объект со всеми его отношениями.Внутреннее соединение JPQL и левое соединение

public Person 
@OneToMany 
List<Cat> 
@ManyToMany 
List<DormRoom> 

Что делать, чтобы получить все объекты;

Person p=PersonDAO.getWithId(1L); 
p.getCats.size(); 
p.getsDormRooms.size(); 

Теперь я задаюсь ГЭТ полностью evulated объект с JPQL, CriteriaBuilder и, возможно, с QueryDSL.

ответ

1

Это называется выборки присоединиться:

select distinct p from Person p left join fetch p.cats left join fetch p.dormRooms 
where p.id = :id 

Остерегайтесь, хотя:

  • в Hibernate, по крайней мере, это будет работать только в том случае, самое большее 1 из коллекций является мешок (т.е. список без любой указанный столбец заказа).
  • , который создаст запрос, возвращающий декартово произведение кошек * dormRooms. Поэтому, если у человека есть 100 кошек и 100 dormRooms, будет восстановлено 10 000 строк.
+0

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

+1

Нет, отредактированный запрос выше вернет единый объект Person со всеми его 100 dormRooms и 100 котами, населенными. Но основной SQL-запрос, который будет выполняться Hibernate, вернет 10000 строк из-за того, как работает SQL. –

+0

И с большим количеством отношений запросы с несколькими соединениями вызывают все больше и больше накладных расходов. Есть ли какое-либо другое оптимальное решение для этих случаев? –

Смежные вопросы