[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-hql-i-jpql-chto-eto-i-chem-otlichayutsya-ot-sql":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":19,"progress":20,"seo":21},1035,"hql-i-jpql-chto-eto-i-chem-otlichayutsya-ot-sql",19,"hibernate","Hibernate","🐻","HQL и JPQL — что это и чем отличаются от SQL?","JPQL (Jakarta Persistence Query Language) — объектно-ориентированный язык запросов, определённый спецификацией JPA. Работает с сущностями и их полями, а не с таблицами и столбцами. HQL (Hibernate Query Language) — расширение JPQL от Hibernate с дополнительными возможностями.\n\n### JPQL vs SQL\n\n```sql\n-- SQL: работает с таблицами\nSELECT u.user_name, d.dept_name\nFROM users u\nJOIN departments d ON u.department_id = d.id\nWHERE u.status = 'ACTIVE';\n\n-- JPQL: работает с сущностями\nSELECT u.name, u.department.name\nFROM User u\nWHERE u.status = com.example.UserStatus.ACTIVE\n```\n\n### Основные возможности JPQL\n\n\u003Cdetails>\n\u003Csummary>Примеры запросов\u003C\u002Fsummary>\n\n```java\n\u002F\u002F SELECT\nList\u003CUser> users = em.createQuery(\n    \"SELECT u FROM User u WHERE u.name LIKE :name\", User.class)\n    .setParameter(\"name\", \"%John%\")\n    .getResultList();\n\n\u002F\u002F JOIN\nList\u003CUser> users = em.createQuery(\n    \"SELECT u FROM User u JOIN u.department d WHERE d.name = :deptName\", User.class)\n    .setParameter(\"deptName\", \"Engineering\")\n    .getResultList();\n\n\u002F\u002F Агрегация\nLong count = em.createQuery(\n    \"SELECT COUNT(u) FROM User u WHERE u.status = :status\", Long.class)\n    .setParameter(\"status\", UserStatus.ACTIVE)\n    .getSingleResult();\n\n\u002F\u002F DTO-проекция (конструктор)\nList\u003CUserDto> dtos = em.createQuery(\n    \"SELECT new com.example.UserDto(u.name, u.email) FROM User u\", UserDto.class)\n    .getResultList();\n\n\u002F\u002F UPDATE (bulk)\nint updated = em.createQuery(\n    \"UPDATE User u SET u.status = :newStatus WHERE u.lastLogin \u003C :date\")\n    .setParameter(\"newStatus\", UserStatus.INACTIVE)\n    .setParameter(\"date\", cutoffDate)\n    .executeUpdate();\n\n\u002F\u002F DELETE (bulk)\nint deleted = em.createQuery(\n    \"DELETE FROM User u WHERE u.status = :status\")\n    .setParameter(\"status\", UserStatus.DELETED)\n    .executeUpdate();\n```\n\n\u003C\u002Fdetails>\n\n### Важное\n\n- JPQL — стандарт JPA, HQL — расширение Hibernate; JPQL-код переносим между реализациями\n- JPQL работает с сущностями, не таблицами: `FROM User u`, не `FROM users u`\n- Навигация по связям через точку: `u.department.name` → Hibernate сгенерирует JOIN\n- Bulk UPDATE\u002FDELETE обходят Persistence Context и L1\u002FL2 Cache — после них нужен `em.clear()`\n\n### Частые ошибки\n\n- Конкатенация параметров в запросе — SQL Injection! Всегда используйте `setParameter()`\n- Bulk UPDATE без `clear()` — L1 Cache не знает об изменениях, данные в памяти устарели\n- Навигация по LAZY-связям в SELECT — `SELECT u.department.name FROM User u` генерирует JOIN, но если department LAZY и не загружен, может привести к N+1 в других сценариях\n- Забывать про fetch — `SELECT u FROM User u` не загружает LAZY-связи; для них нужен JOIN FETCH\n\n### Как используется в 2026\n\n- JPQL\u002FHQL — основной инструмент для нетривиальных запросов в JPA-приложениях\n- Spring Data `@Query` использует JPQL по умолчанию, native SQL — через `nativeQuery = true`\n- Для type-safe запросов — Criteria API или QueryDSL\n- HQL в Hibernate 6 получил новые функции: ARRAY, JSON, улучшенный синтаксис\n\n> **На собеседовании:** покажите разницу между SQL и JPQL: SQL работает с таблицами, JPQL — с сущностями. Упомяните навигацию через точку (u.department.name). Если спросят про безопасность — всегда setParameter(), никогда конкатенация. Про bulk-операции: они обходят Persistence Context, нужен clear().","","middle",[15,16,17,7,18],"jpql","hql","jpa","sql",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":35,"featuredSnippetReady":36},"HQL и JPQL — что это и чем отличаются от SQL — Gymterview","JPQL — объектно-ориентированный язык запросов JPA (работает с сущностями). HQL — расширение от Hibernate. SELECT, JOIN, агрегация, bulk UPDATE\u002FDELETE.","JPQL vs HQL vs SQL: объектные запросы в Hibernate — Gymterview","JPQL работает с сущностями, SQL — с таблицами. HQL расширяет JPQL. Навигация через точку, bulk-операции, защита от SQL Injection.",[27,28,29,30,31,32,33,8,34],"JPQL","HQL","SQL","объектные запросы","JOIN FETCH","bulk UPDATE","setParameter","JPA","JPQL (Jakarta Persistence Query Language) — объектно-ориентированный язык запросов JPA, работающий с сущностями и их полями (FROM User u, не FROM users). HQL — расширение JPQL от Hibernate. Отличия от SQL: навигация через точку (u.department.name), работа с Java-типами, автоматическая генерация JOIN. Bulk UPDATE\u002FDELETE обходят Persistence Context — нужен clear().",true]