Всем привет! В данной статье попробуем разобраться с проблемой N+1 (или может правильнее 1+N?) и как ее решить с помощью использования EntityGraph. Проблема N+1 возникает, когда мы генерируем запрос на получение одной сущности из базы данных, но у данной сущности есть свои связанные сущности, которые мы тоже хотим получить и hibernate генерирует вначале один (1) запрос к базе данных, чтобы получить интересующую нас сущность, а потом N запросов, чтобы достать из базы данных связанные сущности. Данная проблема отражается отрицательно на производительности работы базы данных из-за большого числа обращений к ней. Создадим проект и подключим следующие зависимости: Создадим две простые сущности Client и EmailAddress. Связь между Client и EmailAddress @OneToMany, то есть у одного клиента может быть несколько email адресов.  Создадим также ClientRepository. В application.properties пропишем подключение к базе данных, а также чтобы в консоль выводились sql команды. Создадим класс ClientService, где у нас будет бизнес-логика. В данном классе создадим метод для генерации данных в нашу базу. Создадим 2000 клиентов и пусть у каждого клиента будет по два email адреса. Также создадим ClientController, где будем вызывать методы. Через postman сделаем get запрос на http://localhost:8080/api/v1/client/fillDB наша тестовая база данных должна заполниться. Далее дополним ClientRepository методом Мы будем искать клиентов по части имени. Дополним класс ClientService методом а также дополним класс ClientController методом Создадим проблему N+1: зайдем в postman и сделаем get запрос с параметром clientName на http://localhost:8080/api/v1/client?clientName=Ren И в консоли мы увидим, что hibernate сделал вначале один запрос в базу данных в таблицу client и нашел всех клиентов, а потом еще N-запросов к таблице email_address, чтобы получить у каждого клиента email адреса. Как решить проблему N+1? Суть решения этой проблемы в том чтобы сократить количество запросов к базе данных до необходимого минимума, то есть до одного.  Есть несколько возможных решений, я покажу как это решить с помощью JPA Entity Graph. Entity Graph - позволяет улучшить производительность во время выполнения запросов к базе данных при загрузке связанных ассоциаций и основных полей объекта. JPA Entity Graph загружает данные в один запрос выбора, избегая повторного обращения к базе данных. Это считается хорошим подходом для повышения производительности приложений.   Вариант 1. Пишем аннотацию@EntityGraph над методом findByFullNameContaining в ClientRepository. По умолчания @EntityGraph имеет тип EntityGraphType.FETCH , но для того чтобы понимать, что происходит я его указываю, и он применяет стратегию FetchType.EAGER к указанным атрибутам, то есть к emailAddresses. Зайдем в postman и сделаем снова get запрос с параметром clientName на http://localhost:8080/api/v1/client?clientName=Ren Мы получим только один запрос к базе данных. Вариант 2.  Пишем аннотацию @NamedEntityGraphнад классом Client. В данном случае также будет использоваться "жадная" загрузка указанной связной сущности emailAddresses.  Также необходимо исправить аннотацию над ClientRepository. Cделаем снова get запрос с параметром clientName на http://localhost:8080/api/v1/client?clientName=Ren Получим один запрос к базе данных.  Спасибо Всем кто дочитал до конца данную статью. Всем пока.