Учебники

JPA — Критерий API

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 следующим образом: