JPA - Criteria API

A Criteria API é uma API predefinida usada para definir consultas para entidades. É a forma alternativa de definir uma consulta JPQL. Essas consultas são seguras quanto ao tipo, portáteis e fáceis de modificar alterando a sintaxe. Semelhante ao JPQL, segue o esquema abstrato (esquema fácil de editar) e objetos incorporados. A API de metadados é mesclada com a API de critérios para modelar entidades persistentes para consultas de critérios.

A principal vantagem da API de critérios é que os erros podem ser detectados mais cedo durante o tempo de compilação. As consultas JPQL baseadas em string e as consultas baseadas em critérios JPA são iguais em desempenho e eficiência.

Histórico da API de critérios

A API de critérios está incluída em todas as versões de JPA, portanto, cada etapa da API de critérios é notificada nas especificações de JPA.

  • Em JPA 2.0, a API de consulta de critérios, padronização de consultas são desenvolvidas.
  • No JPA 2.1, atualização e exclusão de critérios (atualização e exclusão em massa) estão incluídas.

Estrutura de consulta de critérios

A Criteria API e o JPQL estão intimamente relacionados e podem ser projetados usando operadores semelhantes em suas consultas. Ele segue o pacote javax.persistence.criteria para projetar uma consulta. A estrutura da consulta significa a consulta de critérios de sintaxe.

A consulta de critérios simples a seguir retorna todas as instâncias da classe de entidade na fonte de dados.

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();

A consulta demonstra as etapas básicas para criar um critério.

  • A instância EntityManager é usada para criar um objeto CriteriaBuilder .
  • A instância CriteriaQuery é usada para criar um objeto de consulta. Os atributos deste objeto de consulta serão modificados com os detalhes da consulta.
  • O método CriteriaQuery.from é chamado para definir a raiz da consulta.
  • CriteriaQuery.select é chamado para definir o tipo de lista de resultados.
  • A instância TypedQuery <T> é usada para preparar uma consulta para execução e especificar o tipo do resultado da consulta.
  • método getResultList no objeto TypedQuery <T> para executar uma consulta. Esta consulta retorna uma coleção de entidades, o resultado é armazenado em uma Lista.

Exemplo de API de critérios

Vamos considerar o exemplo de banco de dados de funcionários. Vamos supor que a tabela jpadb.employee contém os seguintes registros:

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

Crie um projeto JPA no eclipse IDE denominado JPA_Eclipselink_Criteria. Todos os módulos deste projeto são mostrados a seguir:

Criando Entidades

Crie um pacote chamado com.tutorialspoint.eclipselink.entity debaixo ‘src’ pacote.

Crie uma classe chamada Employee.javasob determinado pacote. A classe entidade Employee é mostrada da seguinte forma:

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

O arquivo Persistence.xml é necessário para configurar o banco de dados e o registro das classes de entidade.

Persistence.xml será criado pelo Eclipse IDE enquanto cria um projeto JPA. Os detalhes da configuração são especificações do usuário. O arquivo persistence.xml é mostrado da seguinte forma:

<?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>

Aulas de serviço

Este módulo contém as classes de serviço, que implementam a parte de consulta de critérios usando a inicialização da API MetaData. Crie um pacote chamado‘com.tutorialspoint.eclipselink.service’. A classe chamadaCriteriaAPI.javaé criado sob determinado pacote. A classe DAO é mostrada da seguinte forma:

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( );
   }
}

Após a compilação e execução do programa acima, você obterá a saída no painel do console do Eclipse IDE da seguinte forma:

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