[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-criteria-api-chto-eto-i-kogda-ispolzovat":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},1036,"criteria-api-chto-eto-i-kogda-ispolzovat",19,"hibernate","Hibernate","🐻","Criteria API — что это и когда использовать?","Criteria API — программный (type-safe) способ построения запросов в JPA. В отличие от JPQL (строковые запросы), Criteria API использует Java-объекты для построения запроса, что обеспечивает проверку на этапе компиляции.\n\n### Базовый пример\n\n```java\nCriteriaBuilder cb = entityManager.getCriteriaBuilder();\nCriteriaQuery\u003CUser> query = cb.createQuery(User.class);\nRoot\u003CUser> user = query.from(User.class);\n\n\u002F\u002F SELECT u FROM User u WHERE u.status = 'ACTIVE' AND u.name LIKE '%John%'\nquery.select(user)\n     .where(\n         cb.and(\n             cb.equal(user.get(\"status\"), UserStatus.ACTIVE),\n             cb.like(user.get(\"name\"), \"%John%\")\n         )\n     )\n     .orderBy(cb.asc(user.get(\"name\")));\n\nList\u003CUser> result = entityManager.createQuery(query).getResultList();\n```\n\n### Динамические запросы — основное преимущество\n\n\u003Cdetails>\n\u003Csummary>Пример динамического фильтра\u003C\u002Fsummary>\n\n```java\npublic List\u003CUser> search(String name, UserStatus status, String email) {\n    CriteriaBuilder cb = entityManager.getCriteriaBuilder();\n    CriteriaQuery\u003CUser> query = cb.createQuery(User.class);\n    Root\u003CUser> user = query.from(User.class);\n\n    List\u003CPredicate> predicates = new ArrayList\u003C>();\n\n    if (name != null) {\n        predicates.add(cb.like(cb.lower(user.get(\"name\")), \"%\" + name.toLowerCase() + \"%\"));\n    }\n    if (status != null) {\n        predicates.add(cb.equal(user.get(\"status\"), status));\n    }\n    if (email != null) {\n        predicates.add(cb.equal(user.get(\"email\"), email));\n    }\n\n    query.where(predicates.toArray(new Predicate[0]));\n    return entityManager.createQuery(query).getResultList();\n}\n```\n\n\u003C\u002Fdetails>\n\n### Spring Data JPA Specification (обёртка над Criteria API)\n\n\u003Cdetails>\n\u003Csummary>Пример Specification\u003C\u002Fsummary>\n\n```java\npublic class UserSpecifications {\n    public static Specification\u003CUser> hasName(String name) {\n        return (root, query, cb) -> cb.like(cb.lower(root.get(\"name\")), \"%\" + name.toLowerCase() + \"%\");\n    }\n\n    public static Specification\u003CUser> hasStatus(UserStatus status) {\n        return (root, query, cb) -> cb.equal(root.get(\"status\"), status);\n    }\n}\n\n\u002F\u002F Использование\npublic interface UserRepository extends JpaRepository\u003CUser, Long>, JpaSpecificationExecutor\u003CUser> {}\n\nList\u003CUser> users = userRepository.findAll(\n    Specification.where(UserSpecifications.hasName(\"John\"))\n                 .and(UserSpecifications.hasStatus(UserStatus.ACTIVE))\n);\n```\n\n\u003C\u002Fdetails>\n\n### Важное\n\n- Criteria API — type-safe построение запросов через Java-объекты\n- Основное преимущество — динамические запросы с переменным набором условий\n- Для статических запросов JPQL проще и читаемее\n- Spring Data Specification — удобная обёртка над Criteria API\n\n### Частые ошибки\n\n- Использовать Criteria для простых запросов — JPQL намного читаемее для статических запросов\n- Строки вместо Metamodel — `user.get(\"name\")` не проверяется компилятором; опечатка обнаружится только в runtime\n- Не подключить Metamodel Generator — без `User_` теряется основное преимущество type-safety\n\n### Как используется в 2026\n\n- Spring Data Specification — стандарт для динамических фильтров в REST API\n- QueryDSL — популярная альтернатива Criteria API с более читаемым синтаксом (но проблемы с поддержкой Jakarta)\n- Для сложных запросов — jOOQ набирает популярность как type-safe альтернатива\n\n> **На собеседовании:** Criteria API — для динамических запросов, JPQL — для статических. Упомяните Spring Data Specification как удобную обёртку. Если спросят про type-safety — расскажите про JPA Static Metamodel Generator (User_). QueryDSL — альтернатива с лучшим синтаксисом.","","middle",[15,16,17,7,18],"dynamic-query","specification","jpa","criteria-api",[],null,{"title":22,"description":23,"ogTitle":24,"ogDescription":25,"keywords":26,"schemaAnswer":34,"featuredSnippetReady":35},"Criteria API — что это и когда использовать — Gymterview","Criteria API — type-safe построение запросов через Java-объекты. Для динамических фильтров. Spring Data Specification как обёртка. Metamodel Generator.","Criteria API и Spring Data Specification: динамические запросы — Gymterview","Criteria API для динамических фильтров, Spring Data Specification как обёртка. Type-safety через Metamodel Generator. Сравнение с JPQL и QueryDSL.",[27,28,29,30,31,32,8,33],"Criteria API","CriteriaBuilder","Specification","динамические запросы","Metamodel","JPA","QueryDSL","Criteria API — программный type-safe способ построения запросов в JPA через Java-объекты (CriteriaBuilder, CriteriaQuery, Predicate). Основное преимущество — динамические запросы с переменным набором условий. Для статических запросов JPQL проще. Spring Data Specification — удобная обёртка. JPA Static Metamodel Generator (User_) обеспечивает проверку на этапе компиляции.",true]