[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-chto-takoe-problema-n-1-i-kak-eyo-reshit":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},638,"chto-takoe-problema-n-1-i-kak-eyo-reshit",14,"spring","Spring","🌱","Что такое проблема N+1 и как её решить?","Проблема N+1 -- ситуация, когда для получения данных выполняется 1 запрос для основной коллекции и N дополнительных запросов для загрузки связанных сущностей каждого элемента.\n\n### Пример проблемы\n\n```java\n\u002F\u002F 1 запрос: SELECT * FROM users\nList\u003CUser> users = userRepository.findAll();\n\nfor (User user : users) {\n    \u002F\u002F N запросов: SELECT * FROM orders WHERE user_id = ?\n    System.out.println(user.getOrders().size());\n}\n\u002F\u002F Итого: 1 + N запросов. При 1000 пользователей -- 1001 запрос!\n```\n\n### Решения\n\n### 1. JOIN FETCH (JPQL)\n\n```java\n@Query(\"SELECT u FROM User u JOIN FETCH u.orders WHERE u.status = :status\")\nList\u003CUser> findByStatusWithOrders(@Param(\"status\") String status);\n\u002F\u002F 1 запрос с JOIN\n```\n\n### 2. @EntityGraph\n\n```java\n@EntityGraph(attributePaths = {\"orders\"})\nList\u003CUser> findByStatus(String status);\n```\n\n### 3. Batch fetching\n\n```properties\nspring.jpa.properties.hibernate.default_batch_fetch_size=25\n```\n\nВместо N запросов будет ceil(N\u002F25) запросов с `WHERE user_id IN (?, ?, ..., ?)`.\n\n### 4. DTO-проекция (лучшая производительность)\n\n```java\n@Query(\"SELECT new com.example.dto.UserOrderSummary(u.id, u.name, COUNT(o)) \" +\n       \"FROM User u LEFT JOIN u.orders o GROUP BY u.id, u.name\")\nList\u003CUserOrderSummary> findUserOrderSummaries();\n```\n\n### Как обнаружить\n\n```properties\nspring.jpa.show-sql=true\nlogging.level.org.hibernate.SQL=DEBUG\n```\n\n> **На собеседовании:** назовите проблему, покажите пример и минимум 2-3 решения. Частая ошибка -- использовать JOIN FETCH с пагинацией (Hibernate загрузит все данные в память). Решение -- `@BatchSize` или подзапрос.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое проблема N+1 и как её решить? — Gymterview","Проблема N+1 -- ситуация, когда для получения данных выполняется 1 запрос для основной коллекции и N дополнительных запросов для загрузки связанных сущностей ка","Проблема N+1 -- ситуация, когда для получения данных выполняется 1 запрос для основной коллекции и N дополнительных запр",[7,13],"Проблема N+1 -- ситуация, когда для получения данных выполняется 1 запрос для основной коллекции и N дополнительных запросов для загрузки связанных сущностей каждого элемента.",true]