JPA - JPQL


Advertisements

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

JPA JPQL

Язык запроса базы данных персистирования Java

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

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

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

Fetching полный страстного желания и ленивый

Самая важная принципиальная схема JPA сделать двойной экземпляр базы данных в сверхоперативной памяти. Пока transacting с базой данных, JPA сперва создает двойной комплект данных и только когда оно поручено используя менеджер реальности, изменения произведены эффект в базу данных.

2 путя fetching показатели от базы данных.

Fetch полный страстного желания

В fetching полный страстного желания, родственные предметы ребенка загружены автоматически пока fetching определенный показатель.

Ленивый fetch

В ленивый fetching, родственные предметы не загружены автоматически если вы специфически не будете спрашивать для их. Прежде всего, он проверяет наличие родственных предметов и сообщает. Более поздно, если вы вызываете любой метод геттера той реальности, то оно fetches все показатели.

Ленивый fetch возможен когда вы пробуете fetch показатели для the first time. Что путь, экземпляр показателя целого уже хранится в сверхоперативной памяти. Представлени-велемудрый, ленивый fetch предпочтителен.

Advertisements