Este capítulo describe sobre JPQL y cómo funciona con unidades de persistencia. En este capítulo, los ejemplos dados sigan la misma jerarquía del paquete, que se utilizó en el capítulo anterior.
JPQL está parado para el lenguaje de consulta de persistencia de Java. Se utiliza para crear consultas contra entidades para almacenar en una base de datos relacional. JPQL está desarrollado en base a la sintaxis SQL. Pero no afectará directamente a la base de datos.
JPQL puede recuperar datos mediante la cláusula SELECT, puede hacer a granel actualizaciones con cláusula UPDATE y DELETE cláusula.
Sintaxis JPQL es muy similar a la sintaxis de SQL. Tener SQL como sintaxis es una ventaja porque SQL es simple y siendo ampliamente utilizado. SQL trabaja directamente contra la base de datos relacional tablas, registros y campos, mientras que JPQL trabaja con Java clases e instancias.
Por ejemplo, una consulta JPQL puede recuperar una entidad objeto en lugar de campo conjunto de resultados de una base de datos, al igual que con SQL. El JPQL consulta estructura como sigue.
SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING ...]] [ORDER BY ...]
La estructura de JPQL borrar y consultas de actualización son las siguientes.
DELETE FROM ... [WHERE ...] UPDATE ... SET ... [WHERE ...]
Las funciones escalares devuelven valores resultantes basados en los valores de entrada. Funciones de agregado de devuelvan los valores resultantes mediante el cálculo de los valores de entrada.
Utilizaremos el mismo ejemplo de gestión de empleados como en el capítulo anterior. Aquí nos dirigiremos a través de las clases de servicio utilizando funciones escalares y agregadas de JPQL.
Nos dejaron asumen que la tabla jpadb.employee contiene los siguientes registros.
Eid | Ename | Salary | Deg |
---|---|---|---|
1201 | Gopal | 40000 | Technical Manager |
1202 | Manisha | 40000 | Proof Reader |
1203 | Masthanvali | 40000 | Technical Writer |
1204 | Satish | 30000 | Technical Writer |
1205 | Krishna | 30000 | Technical Writer |
1206 | Kiran | 35000 | Proof Reader |
Crear una clase denominada ScalarandAggregateFunctions.java bajo com.howcodex.eclipselink.service paquete de la siguiente manera.
package com.howcodex.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; public class ScalarandAggregateFunctions { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); //Scalar function Query query = entitymanager.createQuery("Select UPPER(e.ename) from Employee e"); List<String> list=query.getResultList(); for(String e:list) { System.out.println("Employee NAME :"+e); } //Aggregate function Query query1 = entitymanager.createQuery("Select MAX(e.salary) from Employee e"); Double result = (Double) query1.getSingleResult(); System.out.println("Max Employee Salary :" + result); } }
Después de la compilación y ejecución del programa anterior obtendrá la siguiente salida en el panel de consola del IDE de Eclipse.
Employee NAME :GOPAL Employee NAME :MANISHA Employee NAME :MASTHANVALI Employee NAME :SATISH Employee NAME :KRISHNA Employee NAME :KIRAN Max Employee Salary :40000.0
Between (Entre), And (Y), y Like (Como) son las palabras clave principales de JPQL. Estas palabras clave se utilizan después de Donde cláusula en una consulta.
Crear una clase denominada BetweenAndLikeFunctions.java bajo com.howcodex.eclipselink.service paquete de la siguiente manera:
package com.howcodex.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import com.howcodex.eclipselink.entity.Employee; public class BetweenAndLikeFunctions { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); //Between Query query = entitymanager.createQuery( "Select e " + "from Employee e " + "where e.salary " + "Between 30000 and 40000" ); List<Employee> list=(List<Employee>)query.getResultList( ); for( Employee e:list ) { System.out.print("Employee ID :" + e.getEid( )); System.out.println("\t Employee salary :" + e.getSalary( )); } //Like Query query1 = entitymanager.createQuery("Select e " + "from Employee e " + "where e.ename LIKE 'M%'"); List<Employee> list1=(List<Employee>)query1.getResultList( ); for( Employee e:list1 ) { System.out.print("Employee ID :"+e.getEid( )); System.out.println("\t Employee name :"+e.getEname( )); } } }
Después de compilar y ejecutar el programa anterior, obtendrá la siguiente salida en el panel de la consola de Eclipse IDE.
Employee ID :1201 Employee salary :40000.0 Employee ID :1202 Employee salary :40000.0 Employee ID :1203 Employee salary :40000.0 Employee ID :1204 Employee salary :30000.0 Employee ID :1205 Employee salary :30000.0 Employee ID :1206 Employee salary :35000.0 Employee ID :1202 Employee name :Manisha Employee ID :1203 Employee name :Masthanvali
Para ordenar los registros en JPQL, utilizamos la cláusula ORDER BY. El uso de esta cláusula es igual que en SQL, pero se trata de entidades. El ejemplo siguiente muestra cómo utilizar la cláusula ORDER BY.
Crear una clase Ordering.java bajo com.howcodex.eclipselink.service paquete de la siguiente manera:
package com.howcodex.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import com.howcodex.eclipselink.entity.Employee; public class Ordering { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); //Between Query query = entitymanager.createQuery( "Select e " + "from Employee e " + "ORDER BY e.ename ASC" ); List<Employee> list=(List<Employee>)query.getResultList( ); for( Employee e:list ) { System.out.print("Employee ID :" + e.getEid( )); System.out.println("\t Employee Name :" + e.getEname( )); } } }
compilar y ejecutar el programa anterior producirá la siguiente salida en el panel de la consola de Eclipse IDE.
Employee ID :1201 Employee Name :Gopal Employee ID :1206 Employee Name :Kiran Employee ID :1205 Employee Name :Krishna Employee ID :1202 Employee Name :Manisha Employee ID :1203 Employee Name :Masthanvali Employee ID :1204 Employee Name :Satish
Una anotación @NamedQuery se define como una consulta con una cadena de consulta predefinida que es inmutable. En contraste con consultas dinámicas, llamadas consultas pueden mejorar la organización del código al separar las cadenas de consulta JPQL de POJO. También pasa los parámetros de consulta en lugar de incrustar los literales dinámicamente en la cadena de consulta y por lo tanto produce más eficientes consultas.
En primer lugar, añadir anotación @NamedQuery a la clase de entidad empleado llamada Employee.java bajo com.howcodex.eclipselink.entity paquete de la siguiente manera:
package com.howcodex.eclipselink.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table @NamedQuery(query = "Select e from Employee e where e.eid = :id", name = "find employee by id") 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 + "]"; } }
Crear una clase denominada NamedQueries.java bajo com.howcodex.eclipselink.service paquete de la siguiente manera:
package com.howcodex.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import com.howcodex.eclipselink.entity.Employee; public class NamedQueries { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); Query query = entitymanager.createNamedQuery("find employee by id"); query.setParameter("id", 1204); List<Employee> list = query.getResultList( ); for( Employee e:list ) { System.out.print("Employee ID :" + e.getEid( )); System.out.println("\t Employee Name :" + e.getEname( )); } } }
Después de compilar y ejecutar el programa anterior obtendrá la siguiente salida en el panel de la consola de Eclipse IDE.
Employee ID :1204 Employee Name :Satish
Después de agregar todas las clases sobre la jerarquía del paquete Mira como sigue:
El concepto más importante de JPA es hacer una copia duplicada de la base de datos en la memoria caché. Mientras se tramita con una base de datos, la JPA primero crea un duplicado de los datos y sólo cuando se ha comprometido con una entidad Director, los cambios se realizan en la base de datos.
Allí es dos maneras de obtener los registros de la base de datos.
En buscar ansiosos, relacionados con objetos secundarios se cargan automáticamente al ir a buscar un registro concreto.
En recuperar el perezoso, objetos relacionados no se cargan automáticamente a menos que usted solicite específicamente para ellos. En primer lugar, comprueba la disponibilidad de objetos relacionados y notifica. Más tarde, si se llama a cualquiera del método getter de esa entidad, luego recupera todos los registros.
Fetch perezoso es posible cuando se intenta buscar los registros por primera vez. De esa manera, una copia del registro todo ya está almacenada en la memoria caché. Rendimiento, es preferible fetch perezoso.