3.1 Pemetaan entitas gumantung

Ing SQL, sampeyan bisa nulis pitakon nggunakake JOIN. Apa bisa uga ing HQL? Jawaban singkat ya. Nanging jawaban lengkap bakal luwih menarik.

Pisanan, nalika kita nulis JOIN ing SQL, paling asring tegese tabel siji nuduhake tabel liyane. Contone, tabel tugas ngemot kolom employee_id sing nuduhake kolom id saka tabel karyawan.

Ketergantungan iki bisa diterangake nggunakake anotasi ing Hibernate. Pisanan, ayo nggawe Entitas kanggo tabel kita. Pisanan, ayo nerangake tabel karyawan:

@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;
}

Lan kelas EmployeeTask kanggo tabel tugas :

@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;
}

Kabeh apik, nanging ana siji saran. Ayo goleki kolom employeeId ing conto pungkasan:

@Column(name="employee_id")
public Integer employeeId;

Apa sampeyan weruh ana sing aneh? Yen ora, iki tegese sampeyan wis nggawe cara mikir ing basa SQL.

Bab iku ing basa Jawa, kita biasane nggambarake ketergantungan kasebut rada beda:

public Employee employee;

Kita ora perlu nemtokake id , biasane mung nemtokake variabel sing nduweni referensi kanggo obyek Karyawan . Utawa nyimpen null yen ora ana obyek kasebut.

Lan Hibernate ngidini kita njlèntrèhaké kahanan kasebut kanthi nggunakake anotasi:

@ManyToOne
@JoinColumn(name="employee_id", nullable=true)
public Employee employee;

Anotasi kasebut @ManyToOnengandhani Hibernate manawa akeh entitas EmployeeTask bisa ngrujuk menyang siji entitas Karyawan .

Lan anotasi kasebut @JoinColumnnemtokake jeneng kolom saka ngendi id bakal dijupuk . Kabeh informasi liyane sing dibutuhake bakal dijupuk saka anotasi kelas Karyawan.

Asil pungkasan bakal katon kaya iki:

@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 Nggunakake gabung ing HQL

Lan saiki ayo goleki carane nulis pitakon menyang entitas sing gegandhengan ing HQL.

Kahanan pisanan.

Kita duwe karyawan (Pegawe) lan kita pengin njaluk dhaptar tugas. Mangkene apa pitakon kasebut ing SQL:

SELECT task.* FROM task JOIN employee ON task.employee_id = employee.id
WHERE employee.name = "Ivan Ivanovich";

Lan saiki ayo nulis pitakon sing padha ing HQL:

from EmployeeTask where employee.name = "Ivan Ivanovich"

Kelas EmployeeTask duwe lapangan karyawan , lan duwe lapangan jeneng , mula pitakon iki bisa digunakake.

Kahanan loro.

Mbalekake dhaptar karyawan sing duwe tugas sing telat. Mangkene apa pitakon kasebut ing SQL:

SELECT DISTINCT employee.*
FROM task JOIN employee ON task.employee_id = employee.id
WHERE task.deadline < CURDATE();

DISTINCTdigunakake amarga ana akeh tugas sing ditugasake kanggo siji pangguna.

Lan saiki ayo nulis pitakon sing padha ing HQL:

select distinct employee from EmployeeTask where deadline < CURDATE();

karyawan ing pitakon iki minangka lapangan kelas EmployeeTask

Kahanan telu.

Nemtokake kabeh tugas sing ora ditugasake menyang direktur. Pitakonan SQL bakal katon kaya iki:

UPDATE task SET employee_id = 4 WHERE employee_id IS NULL

Lan saiki ayo nulis pitakon sing padha ing HQL:

update EmployeeTask set employee = :user where employee is null

Pitakonan pungkasan yaiku sing paling angel. We kudu pass ID, direktur, nanging kelas EmployeeTask ora ngemot lapangan ngendi sampeyan bisa nulis id, tinimbang ngemot lapangan Employee ngendi sampeyan kudu nemtokake referensi kanggo obyek saka jinis Employee.

Ing Hibernate, masalah iki ditanggulangi kanthi bantuan paramèter pitakon sing diterusake menyang obyek Query. Lan ing HQL dhewe, paramèter kasebut ditulis liwat titik loro: :user. Nanging kita bakal ngomong babagan iki mengko.