[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-spring-kak-ispolzovat-query-jpql-i-native-queries":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},634,"kak-ispolzovat-query-jpql-i-native-queries",14,"spring","Spring","🌱","Как использовать @Query, JPQL и native queries?","Когда query methods недостаточно, Spring Data предоставляет аннотацию `@Query` для написания собственных запросов.\n\nJPQL (Java Persistence Query Language) оперирует сущностями и их полями, а не таблицами и колонками. Native queries используют обычный SQL.\n\n### JPQL\n\n```java\n@Query(\"SELECT u FROM User u WHERE u.email = :email\")\nOptional\u003CUser> findByEmailAddress(@Param(\"email\") String email);\n\n@Query(\"SELECT u FROM User u JOIN u.roles r WHERE r.name = :roleName\")\nList\u003CUser> findByRoleName(@Param(\"roleName\") String roleName);\n\n@Query(\"SELECT new com.example.dto.UserSummary(u.id, u.firstName, u.email) \" +\n       \"FROM User u WHERE u.status = 'ACTIVE'\")\nList\u003CUserSummary> findActiveUserSummaries(); \u002F\u002F DTO-проекция\n```\n\n### Native queries\n\n```java\n@Query(value = \"SELECT * FROM users WHERE email = :email\", nativeQuery = true)\nOptional\u003CUser> findByEmailNative(@Param(\"email\") String email);\n\n@Query(\n    value = \"SELECT * FROM users WHERE status = :status\",\n    countQuery = \"SELECT COUNT(*) FROM users WHERE status = :status\",\n    nativeQuery = true\n)\nPage\u003CUser> findByStatusNative(@Param(\"status\") String status, Pageable pageable);\n```\n\n### Модифицирующие запросы\n\n```java\n@Modifying(clearAutomatically = true)\n@Transactional\n@Query(\"UPDATE User u SET u.status = :status WHERE u.lastLoginAt \u003C :date\")\nint deactivateInactiveUsers(@Param(\"status\") String status,\n                            @Param(\"date\") LocalDateTime date);\n```\n\n### Когда что использовать\n\n| Тип | Когда |\n|-----|-------|\n| Query methods | Простые запросы по 1-2 полям |\n| JPQL | JOIN-ы, агрегация, DTO-проекции |\n| Native SQL | Специфичные функции БД, оптимизация |\n\n> **На собеседовании:** важно знать разницу между JPQL и native SQL и когда применять каждый. Частая ошибка -- забыть `@Modifying` для UPDATE\u002FDELETE или забыть `@Transactional` для модифицирующих запросов. Ещё ошибка -- не указать `clearAutomatically = true`, из-за чего persistence context содержит устаревшие данные.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":19,"keywords":20,"schemaAnswer":19,"featuredSnippetReady":21},"Как использовать @Query, JPQL и native queries? — Gymterview","Когда query methods недостаточно, Spring Data предоставляет аннотацию `@Query` для написания собственных запросов.",[7,13],true]