3.1 आश्रित घटकांचे मॅपिंग

SQL मध्ये, तुम्ही JOIN वापरून क्वेरी लिहू शकता. HQL मध्ये असे करणे शक्य आहे का? लहान उत्तर होय आहे. परंतु संपूर्ण उत्तर अधिक मनोरंजक असेल.

प्रथम, जेव्हा आपण SQL मध्‍ये जॉइन लिहितो, तेव्हा बहुतेकदा याचा अर्थ असा होतो की एक टेबल दुसर्‍या टेबलचा संदर्भ देते. उदाहरणार्थ, टास्क टेबलमध्ये कर्मचारी_आयडी स्तंभ असतो जो कर्मचारी टेबलच्या आयडी स्तंभाचा संदर्भ देतो.

हायबरनेटमधील भाष्ये वापरून या अवलंबित्वाचे वर्णन केले जाऊ शकते. प्रथम, आपल्या टेबलसाठी फक्त संस्था तयार करू. प्रथम, कर्मचारी सारणीचे वर्णन करूया:

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

सर्व काही ठीक आहे, परंतु एक सूचना आहे. शेवटच्या उदाहरणात कर्मचारी आयडी फील्ड पाहू :

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

तुम्हाला काही विचित्र लक्षात आले आहे का? नसल्यास, याचा अर्थ असा की तुम्ही SQL भाषेत विचार करण्याची पद्धत आधीच तयार केली आहे.

गोष्ट अशी आहे की जावा भाषेत, आम्ही सहसा अशा अवलंबित्वाचे वर्णन थोडे वेगळे करतो:

public Employee employee;

आम्हाला आयडी निर्दिष्ट करण्याची आवश्यकता नाही , आम्ही सहसा फक्त एम्प्लॉयी ऑब्जेक्टचा संदर्भ असलेले व्हेरिएबल निर्दिष्ट करतो . किंवा अशी कोणतीही वस्तू नसल्यास शून्य ठेवते.

आणि हायबरनेट आम्हाला भाष्य वापरून अशा परिस्थितीचे वर्णन करण्यास अनुमती देते:

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

भाष्य @ManyToOneहायबरनेटला सांगते की अनेक EmployeeTask संस्था एका कर्मचारी घटकाचा संदर्भ घेऊ शकतात .

आणि भाष्य @JoinColumnज्या स्तंभातून आयडी घेतला जाईल त्याचे नाव निर्दिष्ट करते . इतर सर्व आवश्यक माहिती कर्मचारी वर्गाच्या भाष्यांमधून घेतली जाईल.

अंतिम परिणाम असे दिसेल:

@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 मध्ये संबंधित घटकांना प्रश्न कसे लिहायचे ते पाहू.

पहिली परिस्थिती.

आमच्याकडे एक कर्मचारी (कर्मचारी) आहे आणि आम्हाला त्याच्या कामांची यादी मिळवायची आहे. 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 वर्गात एक कर्मचारी फील्ड आहे आणि त्यात नाव फील्ड आहे , त्यामुळे ही क्वेरी कार्य करेल.

परिस्थिती दोन.

ज्या कर्मचाऱ्यांची थकीत कामे आहेत त्यांची यादी परत करा. 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 वर्गाचे फील्ड आहे

परिस्थिती तीन.

न नियुक्त केलेली सर्व कामे दिग्दर्शकाला सोपवा. SQL क्वेरी असे दिसेल:

UPDATE task SET employee_id = 4 WHERE employee_id IS NULL

आणि आता तीच क्वेरी HQL मध्ये लिहू:

update EmployeeTask set employee = :user where employee is null

शेवटची क्वेरी सर्वात कठीण आहे. आम्हाला आयडी, डायरेक्टर पास करणे आवश्यक आहे, परंतु EmployeeTask क्लासमध्ये तुम्ही आयडी लिहू शकता असे फील्ड नाही, त्याऐवजी त्यामध्ये एक कर्मचारी फील्ड आहे जिथे तुम्हाला एम्प्लॉयी प्रकारच्या ऑब्जेक्टचा संदर्भ नियुक्त करणे आवश्यक आहे.

हायबरनेटमध्ये, क्वेरी ऑब्जेक्टला पास केलेल्या क्वेरी पॅरामीटर्सच्या मदतीने ही समस्या सोडवली जाते. आणि HQL मध्येच, असे पॅरामीटर्स कोलनद्वारे लिहिलेले आहेत: :user. परंतु आपण याबद्दल थोड्या वेळाने बोलू.