Учебники

JPA — JPQL

В этой главе рассказывается о JPQL и о том, как он работает с постоянными модулями. В этой главе примеры следуют той же иерархии пакетов, которую мы использовали в предыдущей главе:

JPA JPQL

Язык запросов персистентности Java

JPQL — это язык запросов персистентности Java, определенный в спецификации JPA. Он используется для создания запросов к сущностям для хранения в реляционной базе данных. JPQL разработан на основе синтаксиса SQL. Но это не повлияет на базу данных напрямую.

JPQL может извлекать информацию или данные, используя предложение SELECT, может выполнять массовые обновления, используя предложение UPDATE и предложение DELETE. API EntityManager.createQuery () будет поддерживать язык запросов.

Структура запроса

Синтаксис JPQL очень похож на синтаксис SQL. Наличие SQL-подобного синтаксиса является преимуществом, поскольку SQL — это простой язык структурированных запросов, и многие разработчики используют его в приложениях. SQL работает непосредственно против таблиц, записей и полей реляционной базы данных, тогда как JPQL работает с классами и экземплярами Java.

Например, запрос JPQL может извлечь объект базы данных, а не набор результатов поля из базы данных, как в SQL. Структура запроса JPQL выглядит следующим образом.

SELECT ... FROM ...
[WHERE ...]
[GROUP BY ... [HAVING ...]]
[ORDER BY ...]

Структура запросов JPQL DELETE и UPDATE более проста следующим образом.

DELETE FROM ... [WHERE ...]
 
UPDATE ... SET ... [WHERE ...]

Скалярные и агрегатные функции

Скалярные функции возвращают результирующие значения на основе входных значений. Агрегатные функции возвращают результирующие значения путем вычисления входных значений.

Следуйте тому же примеру управления сотрудниками, который использовался в предыдущих главах. Здесь мы пройдемся по классам обслуживания, используя скалярные и агрегатные функции JPQL.

Предположим, что таблица jpadb.employee содержит следующие записи.

Ид Ename Оплата труда градус
1201 Гопал 40000 Технический менеджер
1202 Маниша 40000 Proof Reader
1203 Masthanvali 40000 Технический писатель
1204 Сатиш 30000 Технический писатель
1205 Кришна 30000 Технический писатель
1206 Киран 35000 Proof Reader

Создайте класс с именем ScalarandAggregateFunctions.java в пакете com.tutorialspoint.eclipselink.service следующим образом.

package com.tutorialspoint.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);
   }
}

После компиляции и выполнения вышеуказанной программы вы получите вывод на панели консоли Eclipse IDE следующим образом:

Employee NAME :GOPAL
Employee NAME :MANISHA
Employee NAME :MASTHANVALI
Employee NAME :SATISH
Employee NAME :KRISHNA
Employee NAME :KIRAN
ax Employee Salary :40000.0

Между, И, Как Ключевые слова

«Между», «И» и «Нравится» являются основными ключевыми словами JPQL. Эти ключевые слова используются после предложения Where в запросе.

Создайте класс с именем BetweenAndLikeFunctions.java в пакете com.tutorialspoint.eclipselink.service следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.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( ));
      }
   }
}

После компиляции и выполнения вышеуказанной программы вы получите вывод на панели консоли 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

заказ

Чтобы упорядочить записи в JPQL, мы используем предложение ORDER BY. Использование этого предложения такое же, как в SQL, но оно касается сущностей. Следуйте порядку на примере.

Создайте класс Ordering.java в пакете com.tutorialspoint.eclipselink.service следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.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( ));
      }
   }
}

После компиляции и выполнения вышеуказанной программы вы получите вывод на панели консоли 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

Именованные Запросы

Аннотация @NamedQuery определяется как запрос с предопределенной неизменяемой строкой запроса. Вместо динамических запросов использование именованных запросов может улучшить организацию кода путем отделения строк запроса JPQL от POJO. Он также передает параметры запроса вместо динамического встраивания литералов в строку запроса и приводит к более эффективным запросам.

Прежде всего, добавьте аннотацию @NamedQuery к классу сущностей Employee с именем Employee.java в пакете com.tutorialspoint.eclipselink.entity следующим образом:

package com.tutorialspoint.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 + "]";
   }
}

Создайте класс с именем NamedQueries.java в пакете com.tutorialspoint.eclipselink.service следующим образом:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.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( ));
      }
   }
}

После компиляции и выполнения вышеуказанной программы вы получите вывод на панели консоли Eclipse IDE следующим образом:

Employee ID :1204	 Employee Name :Satish

После добавления всех вышеперечисленных классов иерархия пакетов выглядит следующим образом:

Иерархия пакетов

Стремительная и ленивая загрузка

Основная концепция JPA — сделать копию базы данных в кеш-памяти. Во время транзакции с базой данных, сначала это повлияет на дубликаты данных, и только когда они зафиксированы с помощью диспетчера сущностей, изменения будут внесены в базу данных.

Есть два способа извлечения записей из базы данных — полная выборка и отложенная выборка.

Нетерпеливый выбор

Получение всей записи при поиске записи с использованием первичного ключа.

Ленивый выбор

Он проверяет наличие уведомлений с первичным ключом, если он существует. Затем позже, если вы вызовете какой-либо из методов получения этой сущности, он получит целое.

Но ленивая выборка возможна, когда вы пытаетесь получить запись в первый раз. Таким образом, копия всей записи уже хранится в кэш-памяти. Производительность мудрая, ленивая выборка предпочтительнее.