Criteria API — это предопределенный API, используемый для определения запросов для сущностей. Это альтернативный способ определения JPQL-запроса. Эти запросы безопасны по типу, переносимы и легко изменяются путем изменения синтаксиса. Подобно JPQL, он следует абстрактной схеме (схема легко редактируется) и внедренным объектам. API метаданных смешивается с API критериев для моделирования постоянной сущности для запросов критериев.
Основным преимуществом API критериев является то, что ошибки могут быть обнаружены ранее во время компиляции. Запросы на основе строк JPQL и запросы на основе критериев JPA одинаковы по производительности и эффективности.
История критериев API
API критериев включен во все версии JPA, поэтому каждый шаг API критериев уведомляется в спецификациях JPA.
- В JPA 2.0 разработан API запроса критериев стандартизации запросов.
- В JPA 2.1 включены критерии обновления и удаления (массовое обновление и удаление).
Критерии Структура запроса
Criteria API и JPQL тесно связаны и могут разрабатываться с использованием аналогичных операторов в своих запросах. Для разработки запроса следует пакет javax.persistence.criteria. Структура запроса означает синтаксический критерий запроса.
Следующий простой запрос критерия возвращает все экземпляры класса сущностей в источнике данных.
EntityManager em = ...; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Entity class> cq = cb.createQuery(Entity.class); Root<Entity> from = cq.from(Entity.class); cq.select(Entity); TypedQuery<Entity> q = em.createQuery(cq); List<Entity> allitems = q.getResultList();
Запрос демонстрирует основные этапы создания критерия.
- Экземпляр EntityManager используется для создания объекта CriteriaBuilder .
- Экземпляр CriteriaQuery используется для создания объекта запроса. Атрибуты этого объекта запроса будут изменены с подробностями запроса.
- Метод CriteriaQuery.from вызывается для установки корня запроса.
- CriteriaQuery.select вызывается для установки типа списка результатов.
- Экземпляр TypedQuery <T> используется для подготовки запроса к выполнению и указания типа результата запроса.
- Метод getResultList для объекта TypedQuery <T> для выполнения запроса. Этот запрос возвращает коллекцию сущностей, результат сохраняется в списке.
Пример критериев API
Давайте рассмотрим пример базы данных сотрудников. Предположим, что таблица jpadb.employee содержит следующие записи:
Eid Ename Salary Deg 401 Gopal 40000 Technical Manager 402 Manisha 40000 Proof reader 403 Masthanvali 35000 Technical Writer 404 Satish 30000 Technical writer 405 Krishna 30000 Technical Writer 406 Kiran 35000 Proof reader
Создайте проект JPA в IDE затмения с именем JPA_Eclipselink_Criteria . Все модули этого проекта показаны следующим образом:
Создание сущностей
Создайте пакет с именем com.tutorialspoint.eclipselink.entity в пакете ‘src’ .
Создайте класс с именем Employee.java для данного пакета. Класс «Сотрудник» отображается следующим образом:
package com.tutorialspoint.eclipselink.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Employee { @Id @GeneratedValue(strategy= GenerationType.AUTO) private int eid; private String ename; private double salary; private String deg; public Employee(int eid, String ename, double salary, String deg) { super( ); this.eid = eid; this.ename = ename; this.salary = salary; this.deg = deg; } public Employee( ) { super(); } public int getEid( ) { return eid; } public void setEid(int eid) { this.eid = eid; } public String getEname( ) { return ename; } public void setEname(String ename) { this.ename = ename; } public double getSalary( ) { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getDeg( ) { return deg; } public void setDeg(String deg) { this.deg = deg; } @Override public String toString() { return "Employee [eid = " + eid + ", ename = " + ename + ", salary = " + salary + ", deg = " + deg + "]"; } }
persistence.xml
Файл Persistence.xml необходим для настройки базы данных и регистрации классов сущностей.
Persistence.xml будет создан IDE eclipse при создании проекта JPA. Детали конфигурации являются пользовательской спецификацией. Файл persistence.xml отображается следующим образом:
<?xml version = "1.0" encoding = "UTF-8"?> <persistence version="2.0" xmlns = "http://java.sun.com/xml/ns/persistence" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> <persistence-unit name = "Eclipselink_JPA" transaction-type = "RESOURCE_LOCAL"> <class>com.tutorialspoint.eclipselink.entity.Employee</class> <properties> <property name = "javax.persistence.jdbc.url" value = "jdbc:mysql://localhost:3306/jpadb"/> <property name = "javax.persistence.jdbc.user" value = "root"/> <property name = "javax.persistence.jdbc.password" value = "root"/> <property name = "javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name = "eclipselink.logging.level" value = "FINE"/> <property name = "eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit> </persistence>
Классы обслуживания
Этот модуль содержит классы обслуживания, которые реализуют часть запроса Criteria с помощью инициализации MetaData API. Создайте пакет с именем «com.tutorialspoint.eclipselink.service» . Класс с именем CriteriaAPI.java создается под данным пакетом. Класс DAO показан следующим образом:
package com.tutorialspoint.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.tutorialspoint.eclipselink.entity.Employee; public class CriteriaApi { public static void main(String[] args) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager( ); CriteriaBuilder criteriaBuilder = entitymanager.getCriteriaBuilder(); CriteriaQuery<Object> criteriaQuery = criteriaBuilder.createQuery(); Root<Employee> from = criteriaQuery.from(Employee.class); //select all records System.out.println(“Select all records”); CriteriaQuery<Object> select = c riteriaQuery.select(from); TypedQuery<Object> typedQuery = entitymanager.createQuery(select); List<Object> resultlist = typedQuery.getResultList(); for(Object o:resultlist) { Employee e = (Employee)o; System.out.println("EID : " + e.getEid() + " Ename : " + e.getEname()); } //Ordering the records System.out.println(“Select all records by follow ordering”); CriteriaQuery<Object> select1 = criteriaQuery.select(from); select1.orderBy(criteriaBuilder.asc(from.get("ename"))); TypedQuery<Object> typedQuery1 = entitymanager.createQuery(select); List<Object> resultlist1 = typedQuery1.getResultList(); for(Object o:resultlist1){ Employee e=(Employee)o; System.out.println("EID : " + e.getEid() + " Ename : " + e.getEname()); } entitymanager.close( ); emfactory.close( ); } }
После компиляции и выполнения вышеуказанной программы вы получите вывод на панели консоли Eclipse IDE следующим образом: