JPA - API критериев
Criteria API - это предварительно определенный API, используемый для определения запросов для сущностей. Это альтернативный способ определения запроса JPQL. Эти запросы являются типобезопасными, переносимыми и легко модифицируются путем изменения синтаксиса. Подобно JPQL, он следует абстрактной схеме (схема легко редактируется) и встроенным объектам. API метаданных смешан с API критериев для моделирования постоянной сущности для запросов критериев.
Основным преимуществом API критериев является то, что ошибки могут быть обнаружены раньше во время компиляции. Запросы JPQL на основе строк и запросы на основе критериев JPA одинаковы по производительности и эффективности.
История критериев API
API критериев входит во все версии JPA, поэтому каждый шаг API критериев уведомляется в спецификациях JPA.
- В JPA 2.0 разработан API запросов критериев, стандартизация запросов.
- В JPA 2.1 включены обновление и удаление критериев (массовое обновление и удаление).
Структура запроса критериев
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 в среде разработки eclipse с именем JPA_Eclipselink_Criteria. Все модули этого проекта показаны следующим образом:
Создание сущностей
Создайте пакет с именем com.tutorialspoint.eclipselink.entity под ‘src’ пакет.
Создайте класс с именем Employee.javaпод данным пакетом. Сущность класса Employee отображается следующим образом:
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 будет создан средой разработки 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:
Select All records
EID : 401 Ename : Gopal
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish
EID : 405 Ename : Krishna
EID : 406 Ename : Kiran
Select All records by follow Ordering
EID : 401 Ename : Gopal
EID : 406 Ename : Kiran
EID : 405 Ename : Krishna
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish