Эта глава описывает о JPQL и как она работает с блоками персистирования. В этой главе, котор дали примеры следовать такой же иерархией пакета, которую мы использовали в предыдущей главе.
JPQL стоит для языка запроса базы данных персистирования Java. Оно использован для того чтобы создать вопросы против реальностей для того чтобы хранить в реляционной базе данных. Начато JPQL основало на синтаксисе SQL. Но оно не повлияет на базу данных сразу.
JPQL может восстановить данные используя ОТБОРНУЮ клаузулу, может сделать навальные новые версии используя клаузулу НОВОЙ ВЕРСИИ и УНИЧТОЖИТЬ клаузулу.
Синтаксис JPQL очень подобен к синтаксису SQL. Иметь SQL как синтаксис преимущество потому что SQL прост и широко используем. SQL работает сразу против таблиц реляционной базы данных, показателей, и полей, тогда как JPQL работает с типами и примерами Java.
Например, вопрос JPQL может восстановить предмет реальности вернее чем установленный результат поля от базы данных, как с SQL. Структура вопроса JPQL следующим образом.
SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING ...]] [ORDER BY ...]
Структура вопросов УДАЛЕНИЯ и НОВОЙ ВЕРСИИ JPQL следующим образом.
DELETE FROM ... [WHERE ...] UPDATE ... SET ... [WHERE ...]
Скалярные функции возвращают возникающие значения основанные на значениях входного сигнала. Агрегатные функции возвращают возникающие значения путем высчитывать значения входного сигнала.
Мы будем использовать такое же управление работника примера как в предыдущей главе. Здесь мы пойдем через типы обслуживания используя скалярные и агрегатные функции JPQL.
Допустим, таблица jpadb.employee содержит следовать показатели.
Eid | Ename | Зарплата | Deg |
---|---|---|---|
1201 | Gopal | 40000 | Технический менеджер |
1202 | Manisha | 40000 | Читатель доказательства |
1203 | Masthanvali | 40000 | Технический сочинитель |
1204 | Satish | 30000 | Технический сочинитель |
1205 | Krishna | 30000 | Технический сочинитель |
1206 | Kiran | 35000 | Читатель доказательства |
Создайте тип названный ScalarandAggregateFunctions.java под пакетом com.howcodex.eclipselink.service следующим образом.
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); } }
После составления и исполнения вышеуказанной программы вы получите следующий выход на панели пульта затмения IDE.
Employee NAME :GOPAL Employee NAME :MANISHA Employee NAME :MASTHANVALI Employee NAME :SATISH Employee NAME :KRISHNA Employee NAME :KIRAN Max Employee Salary :40000.0
Между, и, и как главным образом ключевые слова JPQL. Эти ключевые слова использованы позже где клаузула в вопросе.
Создайте тип названный BetweenAndLikeFunctions.java под пакетом com.howcodex.eclipselink.service следующим образом:
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( )); } } }
После составлять и исполнять вышеуказанную программу, вы получите следующий выход в панели пульта затмения 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, мы используем ЗАКАЗ клаузулой. Использование этой клаузулы такое же как в SQL, но оно общается с реальностями. Следующий пример показывает как использовать ЗАКАЗ клаузулой.
Создайте тип Ordering.java под пакетом com.howcodex.eclipselink.service следующим образом:
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( )); } } }
составляющ и исполняющ вышеуказанную программу вы произведете следующий выход в панели пульта затмения 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 по мере того как вопрос с предопределенной строкой вопроса которая unchangeable. В отличие от динамических названных вопросов, вопросами смогите улучшить организацию Кода путем отделять строки вопроса JPQL от POJO. Оно также проходит параметры вопроса вернее чем врезать литералы динамически в строку вопроса и поэтому производит более эффективные вопросы.
Прежде всего, добавьте приписку @NamedQuery к реальности Employee.java работника названному типом под пакетом com.howcodex.eclipselink.entity следующим образом:
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 + "]"; } }
Создайте тип названный NamedQueries.java под пакетом com.howcodex.eclipselink.service следующим образом:
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( )); } } }
После составлять и исполнять вышеуказанной программы вы получите следующий выход в панели пульта затмения IDE.
Employee ID :1204 Employee Name :Satish
После добавлять все вышеуказанные типы взгляды иерархии пакета следующим образом:
Самая важная принципиальная схема JPA сделать двойной экземпляр базы данных в сверхоперативной памяти. Пока transacting с базой данных, JPA сперва создает двойной комплект данных и только когда оно поручено используя менеджер реальности, изменения произведены эффект в базу данных.
2 путя fetching показатели от базы данных.
В fetching полный страстного желания, родственные предметы ребенка загружены автоматически пока fetching определенный показатель.
В ленивый fetching, родственные предметы не загружены автоматически если вы специфически не будете спрашивать для их. Прежде всего, он проверяет наличие родственных предметов и сообщает. Более поздно, если вы вызываете любой метод геттера той реальности, то оно fetches все показатели.
Ленивый fetch возможен когда вы пробуете fetch показатели для the first time. Что путь, экземпляр показателя целого уже хранится в сверхоперативной памяти. Представлени-велемудрый, ленивый fetch предпочтителен.