Пожалуйста, помогите мне понять, где использовать обычный присоединиться и где присоединиться принести.
Например, если у нас есть эти два запроса
FROM Employee emp
JOIN emp.department dep
и
FROM Employee emp
JOIN FETCH emp.department dep
Есть ли разница между ними? Если да, какой из них использовать, когда?
В этих двух запросов, вы используете присоединиться к запрос всех сотрудников, которые имеют хотя бы один отдел.
Но, разница есть: в первом запросе вы возвращаете только служащие для гибернации. Во втором запросе вы возвращаете служащие и всех подразделений, связанных.
Так что, если вы будете использовать второй запрос, вам не нужно делать новый запрос, снова попал в базы данных, чтобы увидеть департаментах каждого сотрудника.
Вы можете использовать второй запрос, когда вы уверены, что вам понадобится отдела каждого сотрудника. Если вам не нужен департамент, использовать первый запрос.
Я рекомендую прочитать эту ссылку, Если вам нужно применить условие WHERE (что вы, вероятно, понадобится): https://stackoverflow.com/questions/5816417/how-to-properly-express-jpql-join-fetch-with-where-clause-as-jpa-2-criteriaq
Обновление
Если вы Don'т использовать "взять" и департаменты продолжают быть возвращены, потому что ваше соответствие между employee и Department (а @OneToMany
) установлены с параметра fetchtype.Рвется. В этом случае любая бумага HQL (с "взять" или нет) запрос от сотрудника приведет всех отделов. Помните, что все сопоставления *Тоона (
@ManyToOne и@Одинводин`) готовы по умолчанию.
в этой ссылке я уже говорил на комментарий, прочитайте эту часть :
а "принести" и позволяет присоединиться к ассоциации или наборы значений инициализируется вместе с родительскими объектами, используя одиночный выбор. Это особенно полезно в случае сбора. Ить эффективно перекрывает внешнее соединение и ленивый объявлений сопоставление файла для организаций и коллекций.
этот "и присоединиться принести" и будет's эффекта, если у вас (принести = параметра fetchtype.Ленивый) имущество для сбора внутренней сущности(пример ниже).
И это только методом "при запросе должно случиться и". Вы также должны знать this:
гибернация есть два ортогональных понятия : когда ассоциация притянута за уши и как > есть она извлечена. Важно, что вы не путайте их. Мы используем выборки для настройки производительности. Мы можем использовать ленивы, чтобы определить договор на что данные всегда доступны в любом отдельно стоящий экземпляр класс.
когда ассоциация извлечена --> вашу "принести" и типа
как ее доставали --> объединить/выбрать/выбрать/партии
В вашем случае, принести только он's эффекта, если у вас есть отдел как установить внутри сотрудника, что-то подобное в лицо:
@OneToMany(fetch = FetchType.LAZY)
private Set<Department> department;
при использовании
FROM Employee emp
JOIN FETCH emp.department dep
вы получите ЭМП
и Эми.ДЭП
. когда вы не пользовались за вами еще может вам `ЭМП.ДЭП-но Hibernate будет обрабатывать другой выбор к базе данных, чтобы получить этот набор отдела.
так что его просто вопрос настройки производительности, О вы хотите получить результат(нужно вам это или нет) в одном запросе(жадной загрузки), или вы хотите выполнить запрос к ней последним, когда вам это нужно(лень выборки).
Использовать жадной загрузки, когда вам нужно сделать небольшие данные с одного выбрать(один большой запрос). Или используйте ленивый выборки в запросе, что необходимо последней(множество мелких запросов).
использование выборки при :
не большой ненужные коллекции/набор внутри этой сущности вы собираетесь сделать
сообщение от сервера приложений к базы данных сервера слишком далеко и нужно много времени
вам может понадобиться эта коллекция последняя, когда вы Дон'т иметь доступ к нему(за на транзакционные метод/класс)
Если у вас есть @сопоставление одинводин значение параметра fetchtype.Ленивый и вам использовать второй запрос(нужно ведь объекты управления должны быть загружены как часть объектов employee), что Hibernate будет делать, он будет выдавать запросы на выборку объектов управления для каждого отдельного объекта employee, он извлекает из БД. Далее в коде вы можете получить доступ к объектам управления через сотрудника отдела однозначные ассоциации и Hibernate не будет выдавать любой запрос, чтобы получить объект управления для конкретного работника. Помните, гибернации еще вопросы, запросы, равное количеству сотрудников она извлечена. Hibernate будет выдавать одинаковое количество запросов в обоих вышеуказанных запросов если вы хотите получить доступ к объектам управления всеми объектами работника
Dherik : я'м не уверен, о чем вы говорите, когда вы не'т использовать принести результат будет типа : список<объект [ ] и GT;
, что означает список таблиц объекта, а не список сотрудников.
Object[0] refers an Employee entity
Object[1] refers a Departement entity
При использовании выборки, есть только один выбор, а результатом является список сотрудников в <сотрудник>
содержащий список отделов. Он переопределяет ленивых декларации сущности.