3.1 ์ข ์ ์ํฐํฐ ๋งคํ
SQL์์๋ JOIN์ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. HQL์์๋ ๋์ผํ ์์ ์ ์ํํ ์ ์์ต๋๊น? ์งง์ ๋๋ต์ '์'์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฒด ๋ต๋ณ์ด ๋ ํฅ๋ฏธ๋ก์ธ ๊ฒ์ ๋๋ค.
์ฒซ์งธ, SQL์์ JOIN์ ์์ฑํ ๋ ๋๋ถ๋ถ ํ ํ ์ด๋ธ์ด ๋ค๋ฅธ ํ ์ด๋ธ์ ์ฐธ์กฐํ๋ค๋ ์๋ฏธ์ ๋๋ค. ์๋ฅผ ๋ค์ด ์์ ํ ์ด๋ธ์๋ ์ง์ ํ ์ด๋ธ์ id ์ด์ ์ฐธ์กฐํ๋ employee_id ์ด์ด ํฌํจ๋์ด ์์ต๋๋ค.
์ด ์ข ์์ฑ์ Hibernate์ ์ฃผ์์ ์ฌ์ฉํ์ฌ ์ค๋ช ํ ์ ์์ต๋๋ค. ๋จผ์ ํ ์ด๋ธ์ ๋ํ ์ํฐํฐ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ์ง์ ํ ์ด๋ธ์ ๋ํด ์ค๋ช ํ๊ฒ ์ต๋๋ค.
@Entity
@Table(name="employee")
class Employee {
@Column(name="id")
public Integer id;
@Column(name="name")
public String name;
@Column(name="salary")
public Integer salary;
@Column(name="join_date")
public Date joinDate;
}
์์ ํ ์ด๋ธ ์ ๋ํ EmployeeTask ํด๋์ค :
@Entity
@Table(name="task")
class EmployeeTask {
@Column(name="id")
public Integer id;
@Column(name="name")
public String name;
@Column(name="employee_id")
public Integer employeeId;
@Column(name="deadline")
public Date deadline;
}
๋ชจ๋ ๊ฒ์ด ๊ด์ฐฎ์ง๋ง ํ ๊ฐ์ง ์ ์์ด ์์ต๋๋ค. ๋ง์ง๋ง ์์์ employeeId ํ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค .
@Column(name="employee_id")
public Integer employeeId;
์ด์ํ ์ ์ด ๋ณด์ด์๋์? ๊ทธ๋ ์ง ์๋ค๋ฉด ์ด๋ฏธ SQL ์ธ์ด๋ก ์ฌ๊ณ ๋ฐฉ์์ ํ์ฑํ์์ ์๋ฏธํฉ๋๋ค.
๋ฌธ์ ๋ Java ์ธ์ด์์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์ข ์์ฑ์ ์ฝ๊ฐ ๋ค๋ฅด๊ฒ ์ค๋ช ํ๋ค๋ ๊ฒ์ ๋๋ค.
public Employee employee;
id ๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก Employee ๊ฐ์ฒด ์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ ๋ณ์๋ง ์ง์ ํฉ๋๋ค . ๋๋ ๊ทธ๋ฌํ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด null์ ์ ์ฅํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Hibernate๋ ์ฃผ์์ ์ฌ์ฉํ์ฌ ๊ทธ๋ฌํ ์ํฉ์ ์ค๋ช ํ ์ ์๋๋ก ํฉ๋๋ค.
@ManyToOne
@JoinColumn(name="employee_id", nullable=true)
public Employee employee;
์ฃผ์์ @ManyToOne
๋ง์ EmployeeTask ์ํฐํฐ๊ฐ ํ๋์ Employee ์ํฐํฐ๋ฅผ ์ฐธ์กฐํ ์ ์์์ Hibernate์ ์๋ ค์ค๋๋ค .
๊ทธ๋ฆฌ๊ณ ์ฃผ์์ ID๋ฅผ@JoinColumn
๊ฐ์ ธ์ฌ ์ด์ ์ด๋ฆ์ ์ง์ ํฉ๋๋ค . ๋ค๋ฅธ ๋ชจ๋ ํ์ํ ์ ๋ณด๋ Employee ํด๋์ค์ ์ฃผ์์์ ๊ฐ์ ธ์ต๋๋ค.
์ต์ข ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@Entity
@Table(name="task")
class EmployeeTask
{
@Column(name="id")
public Integer id;
@Column(name="name")
public String name;
@ManyToOne
@JoinColumn(name="employee_id", nullable=true)
public Employee employee;
@Column(name="deadline")
public Date deadline;
}
3.2 HQL์์ ์กฐ์ธ ์ฌ์ฉ
์ด์ HQL์์ ๊ด๋ จ ์ํฐํฐ์ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ฒซ ๋ฒ์งธ ์ํฉ.
์ง์(Employee)์ด ์๊ณ ๊ทธ์ ์์ ๋ชฉ๋ก์ ์ป๊ณ ์ถ์ต๋๋ค. ํด๋น ์ฟผ๋ฆฌ๋ SQL์์ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
SELECT task.* FROM task JOIN employee ON task.employee_id = employee.id
WHERE employee.name = "Ivan Ivanovich";
์ด์ HQL์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
from EmployeeTask where employee.name = "Ivan Ivanovich"
EmployeeTask ํด๋์ค ์๋ ์ง์ ํ๋ ์ ์ด๋ฆ ํ๋๊ฐ ์์ผ๋ฏ๋ก ์ด ์ฟผ๋ฆฌ๊ฐ ์๋ํฉ๋๋ค.
์ํฉ 2.
๊ธฐํ์ด ์ง๋ ์ง์ ๋ชฉ๋ก์ ๋ฐํํฉ๋๋ค. ํด๋น ์ฟผ๋ฆฌ๋ SQL์์ ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
SELECT DISTINCT employee.*
FROM task JOIN employee ON task.employee_id = employee.id
WHERE task.deadline < CURDATE();
DISTINCT
ํ ์ฌ์ฉ์์๊ฒ ๋ง์ ์์
์ด ํ ๋น๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ๋ฉ๋๋ค.
์ด์ HQL์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
select distinct employee from EmployeeTask where deadline < CURDATE();
์ด ์ฟผ๋ฆฌ์ ์ง์์ EmployeeTask ํด๋์ค ์ ํ๋์ ๋๋ค.
์ํฉ 3.
ํ ๋น๋์ง ์์ ๋ชจ๋ ์์ ์ ๊ฐ๋ ์๊ฒ ํ ๋นํฉ๋๋ค. SQL ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
UPDATE task SET employee_id = 4 WHERE employee_id IS NULL
์ด์ HQL์ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
update EmployeeTask set employee = :user where employee is null
๋ง์ง๋ง ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ฅ ์ด๋ ค์ด ์ฟผ๋ฆฌ์ ๋๋ค. ์ฐ๋ฆฌ๋ ID, director๋ฅผ ์ ๋ฌํด์ผ ํ์ง๋ง EmployeeTask ํด๋์ค์๋ id๋ฅผ ์์ฑํ ์ ์๋ ํ๋๊ฐ ํฌํจ๋์ด ์์ง ์๊ณ Employee ์ ํ์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ํ ๋นํด์ผ ํ๋ Employee ํ๋๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
Hibernate์์ ์ด ๋ฌธ์ ๋ Query ๊ฐ์ฒด์ ์ ๋ฌ๋๋ ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ๋์์ผ๋ก ํด๊ฒฐ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ HQL ์์ฒด์์ ์ด๋ฌํ ๋งค๊ฐ๋ณ์๋ ์ฝ๋ก ์ ํตํด ์์ฑ๋ฉ๋๋ค :user
. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ํด์๋ ๋์ค์ ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค.
GO TO FULL VERSION