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. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.