В этой главе рассказывается о 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 — сделать копию базы данных в кеш-памяти. Во время транзакции с базой данных, сначала это повлияет на дубликаты данных, и только когда они зафиксированы с помощью диспетчера сущностей, изменения будут внесены в базу данных.
Есть два способа извлечения записей из базы данных — полная выборка и отложенная выборка.
Нетерпеливый выбор
Получение всей записи при поиске записи с использованием первичного ключа.
Ленивый выбор
Он проверяет наличие уведомлений с первичным ключом, если он существует. Затем позже, если вы вызовете какой-либо из методов получения этой сущности, он получит целое.
Но ленивая выборка возможна, когда вы пытаетесь получить запись в первый раз. Таким образом, копия всей записи уже хранится в кэш-памяти. Производительность мудрая, ленивая выборка предпочтительнее.