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