Java Persistence Query Language
Simple Select
JOIN
Collection Path Expression
Constructor Expression
Aggregate Function
NamedQuery
Employee
Department
Project
Login
ReleaseNote
*........1
* ........ *
1 ........ 1
HQL:
SELECT e
FROM Employee eSQL:
SELECT id, name, salary, dept_id, address_id
FROM emp Entity: Employee
Identification variable : e (*)
public class Employee {
private long id;
private String name;
private Address address;
private Department department;
private Double salary;
//constructor, getters, setters
}
#2 Select All Employee attributes
HQL:
SELECT e.name
FROM Employee eSQL:
SELECT name
FROM emp#1 Select Particular Attribute Name
HQL:
FROM Employee e
JOIN e.departmentSQL:
SELECT e.id as empId,
e.address_id,
e.dept_id,
e.name as empName,
e.salary,
FROM table_employee e INNER JOIN table_department department
ON (e.dept_id = d.id)HQL:
FROM Employee e
JOIN FETCH e.departmentSQL:
SELECT e.id as empId,
e.address_id,
e.dept_id,
e.name as empName,
e.salary,
d.name as deptName,
d.id as deptId,
FROM table_employee e INNER JOIN table_department department
ON (e.dept_id = d.id)#4 Eagerly Load Department with Employee
#3 JOIN Department with Employee
HQL:
FROM Employee e
WHERE e.department IS NOT NULLSQL:
SELECT e.id, e.address_id, e.dept_id, e.name, e.salary
FROM table_employee e
WHERE e.dept_id IS NOT NULLHQL:
SELECT DISTINCT e.department
FROM Employee e
WHERE e.salary >= :salarySQL:
SELECT DISTINCT d.id, d.name
FROM table_employee e
INNER JOIN table_department d ON (e.dept_id = d.id)
WHERE e.salary >= ?#5 Employes who have department assigned
#6 Department, Filtered by employee salary (Implicit join)
HQL:
FROM Employee e
WHERE e.projects IS NOT EMPTYSQL:
SELECT e.id, e.address_id, e.dept_id, e.name, e.phone_number, e.salary
FROM table_employee e
WHERE
EXISTS (
SELECT p.id
FROM
table_employee_project ep,
table_project p
WHERE
e.id = ep.employee_id AND ep.project_id = p.id
)
HQL:
SELECT e FROM Employee e,
IN (e.projects) p
WHERE p.projectType = :typeSQL:
SELECT e.id, e.address_id, e.dept_id, e.name, e.phone_number, e.salary
FROM table_employee e
INNER JOIN table_employee_project ep (ON e.id = ep.employee_id)
INNER JOIN table_project p ON (ep.project_id = p.id)
WHERE p.project_type=?
#7 Employes who have any project assigned
* Has to be distinct
#8 Employes who work in a particular type of project
HQL:
FROM Employee e
WHERE SIZE(e.projects) >= :projectCountSQL:
SELECT e.id, e.address_id, e.dept_id,
e.name, e.phone_number, e.salary
FROM table_employee e
WHERE
(
SELECT
COUNT(ep.employee_id)
FROM table_employee_project ep
WHERE e.id = ep.employee_id
) >= ?#9 SIZE () function
MEMBER OF, NOT MEMBER OF
HQL:
SELECT e.id, e.name, COUNT (p), COUNT(DISTINCT p.projectType)
FROM Employee e
JOIN e.projects p
GROUP BY e.id, e.nameAVG, COUNT, MAX, MIN, and SUMSQL:
SELECT e.id, e.name, COUNT(p.id) projects, COUNT(DISTINCT p.project_type) projectTypes
FROM table_employee e
INNER JOIN table_employee_project ep ON (e.id = ep.employee_id)
INNER JOIN table_project p ON (ep.project_id = p.id)
GROUP BY e.id, e.name
HQL:
SELECT AVG(e.salary) FROM Employee eSQL:
SELECT * FROM (
SELECT AVG(e.salary) FROM table_employee e
)
#10 COUNT, AVG
HQL:
SELECT NEW net.therap.command.EmployeeRowCmd(e.name, e.department.name, e.phoneNumber)
FROM Employee epublic class EmployeeRowCmd implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String departmentName;
private String phoneNumber;
public EmployeeRowCmd(String name, String departmentName, String phoneNumber) {
this.name = name;
this.departmentName = departmentName;
this.phoneNumber = phoneNumber;
}
// getters and setters
}SQL:
SELECT e.name empName, d.name as deptName, e.phone_number
FROM table_employee e, table_department d
WHERE e.dept_id = d.id#11 Select Subset
@Entity
@Table(name = "table_employee")
@NamedQueries({
@NamedQuery(name = "Employee.findAll",
query = "SELECT e FROM Employee e"),
@NamedQuery(name = "Employee.findByName",
query = "SELECT e FROM Employee e WHERE e.name = :name"),
})
public class Employee implements Serializable {
@Id
@GeneratedValue(generator = "tmpEmployeeSeq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "tmpEmployeeSeq", sequenceName = "tmp_employee_seq", allocationSize = 1)
private long id;
private String name;
.....
.....
}Enforce the best practice of using query parameters
3.6.10.Final in Application
4.3.0.Final in Demo
5.2.5.Final Latest (November 2016)
Road Map
DEMO
Convert between the database and the Java representation
Work with attributes of
Doesn't work with -
DEMO
DEMO
Steps -
The primary key and version fields always fetched
DEMO