JPA - Critérios API



Critérios predefinidos é uma API que é usado para definir consultas a entidades. Trata-se de um forma alternativa de definir a JPQL consulta. Essas consultas são do tipo-cofre, portáteis e fáceis de modificar, alterar a sintaxe. Semelhante a JPQL, segue um esquema abstrato (fácil de editar esquema) e objetos incorporados. A API de metadados é misturada com criteria API para modelo entidade persistente aos critérios pedidos.

A grande vantagem da Criteria API é que erros podem ser detectadas mais precocemente durante o tempo de compilação. Seqüência de consultas JPQL e baseado em critérios JPA consultas baseadas são as mesmas em termos de desempenho e eficiência.

História da criteria API

O critério é incluído em todas as versões do JPA, pois, cada passo dos critérios é notificado no caderno da JPA.

  • Em JPA 2.0, os critérios API de consulta, a padronização das consultas são desenvolvidos.
  • Em JPA 2.1, critérios update e delete (bulk update e delete) estão incluídos.

Estrutura de consulta Critérios

Os critérios e a JPQL estão intimamente ligados e são permitidos para o projeto usando os operadores semelhantes em suas consultas. Ele segue javax.microedition.media persistência.critérios pacote para projetar uma consulta. A estrutura de consulta significa a sintaxe critérios consulta.

O seguintes critérios simples consulta retorna todas as instâncias da classe de entidades, a 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 mostra os passos básicos para criar um critério.

  • Instância EntityManager é usado para criar um CriteriaBuilder objeto.

  • CriteriaQuery exemplo é usado para criar um objeto de consulta. Esta consulta do objeto atributos será modificado com os detalhes da consulta.

  • CriteriaQuery.método form é chamado a definir a raiz da consulta.

  • CriteriaQuery.selecione é chamado a definir a lista de resultados.

  • TypedQuery<T>exemplo é usado para preparar uma consulta para execução e especificando o tipo do resultado da consulta.

  • O método getResultList TypedQuery<T> objeto para executar uma consulta. Esta consulta retorna uma coleção de entidades, o resultado é armazenado em uma lista.

Exemplo de criteria API

Vamos considerar o exemplo do banco de dados de funcionários. Consideremos o jpadb.trabalhador tabela 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

Criar uma JPA projeto no IDE eclipse chamado JPA_Eclipselink_Criteria. Todos os módulos do presente projeto são discutidas a seguir:

Criar Entidades

Criar um pacote chamadocom.tutorialspoint.eclipselink.entitysob‘src’ pacote.

Criar uma classe chamada Employee.java sob determinado pacote. A classe empregado entidade é mostrado como se segue:

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 + "]";
   }
}

Persistência.xml

Arquivo persistence.xml é a seguinte:

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

Classes de Serviço

Este módulo contém as classes de serviço, que implementa os critérios consulta peça usando a API de metadados a inicialização. Criar um pacote chamado‘com.tutorialspoint.eclipselink.service’. A classe chamada CriteriaAPI.java é criada em cada pacote. A DAO aula é mostrado como se segue:

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 =criteriaQuery.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 compilar e executar o programa que você irá obter o seguinte resultado no painel do console do 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
Advertisements