Join HQL da

All lectures for UZ purposes
Daraja, Dars
Mavjud

3.1 Bog'langan entitilarni xaritalash

SQLda JOIN ishlatib so'rov yozish mumkin. HQLda ham shunday qilish mumkinmi? Qisqa javob – ha. To'liq javob esa qiziqarliroq bo'ladi.

Birinchidan, SQLda JOIN yozayotganda, ko'pchilikda bir jadvallar boshqa jadvalga bog'langan degani. Masalan, task jadvali employee_id ustuni orqali employee jadvalidagi id ustuniga bog'langan.

Bu bog'liqlik Hibernateda anotatsiyalar orqali tavsiflanishi mumkin. Avvaliga, jadvallarimiz uchun Entiti yaratamiz. Avval employee jadvalini tasvirlaymiz:


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

Va EmployeeTask klassi uchun task jadvali:


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

Hammasi yaxshi, lekin bir taklif bor. Oxirgi misoldagi employeeId maydoniga qaraylik:


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

Hech narsa ajablanarlimi? Yo'q bo'lsa, demak sizda SQL tilida tafakkur shakllangan.

Gap shundaki, Java tilida biz bunday bog'liqlikni biroz boshqacha tasvirlaymiz:


public Employee employee;

Bizga id ko'rsatish kerak emas, odatda biz to'g'ridan-to'g'ri Employee ob'ektiga havola saqlovchi o'zgaruvchini ko'rsatamiz. Ob'ekt mavjud emas bo'lsa, null saqlanadi.

Va Hibernate bizga bunday holatni anotatsiyalar yordamida tasvirlashga imkon beradi:


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

@ManyToOne anotatsiyasi Hibernate ga ko'plab EmployeeTask entitilari bitta Employee entitiga bog'lanishi mumkinligini bildiradi.

@JoinColumn anotatsiyasi id olinadigan ustun nomini ko'rsatadi. Qolgan barcha kerakli ma'lumotlar Employee klassidagi anotatsiyalardan olinadi.

Nihoyat natija shunday ko'rinishga ega bo'ladi:


@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 Join ni HQL da ishlatish

Endi bog'langan entitilar uchun HQLda so'rovlarni qanday yozish kerakligini o'rganamiz.

Birinchi holat.

Bizda xodim (Employee) bor va uning vazifalar ro'yhatini olishni xohlaymiz. Bu so'rov SQLda qanday ko'rinishga ega bo'ladi:


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

Endi bu so'rovni HQLda yozamiz:


from EmployeeTask where employee.name = "Ivan Ivanovich"

EmployeeTask klassida employee maydoni mavjud, va unda name maydoni mavjud, shuning uchun bunday so'rov ishlaydi.

Ikkinchi holat.

Vazifa muddati o‘tgan ishchilar ro‘yxatini qaytaring. Bu so'rov SQLda qanday ko'rinishga ega bo'ladi:


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

DISTINCT ishlatiladi, chunki bitta foydalanuvchiga ko'p vazifalar tayinlangan bo'lishi mumkin.

Endi bu so'rovni HQLda yozamiz:


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

employee bu so'rovda EmployeeTask klassining maydonidir

Uchinchi holat.

Barcha tayinlanmagan vazifalarni direktorga tayinlang. SQLda so'rov quyidagicha ko'rinadi:


UPDATE task SET employee_id = 4 WHERE employee_id IS NULL

HQLda bu so'rovni yozamiz:


update EmployeeTask set employee = :user where employee is null

Oxirgi so'rov eng qiyin. Direktorning ID sini uzatish kerak, lekin EmployeeTask klassida bu ID ni saqlash uchun o'zgaruvchi yo'q, uning o'rniga Employee turidagi ob'ektga havola beruvchi maydon mavjud.

Hibernate da bu muammo so'rovga Query obyektiga uzatiladigan parametrlar yordamida hal qilinadi. Lekin HQL da bunday parametrlar ikki nuqta orqali yoziladi: :user. Ammo bu haqida keyinroq gapiramiz.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION