3.1 आश्रित संस्थाओं का मानचित्रण

SQL में, आप JOIN का उपयोग करके प्रश्न लिख सकते हैं। क्या एचक्यूएल में ऐसा करना संभव है? छोटा जवाब हां है। लेकिन पूरा जवाब और दिलचस्प होगा।

सबसे पहले, जब हम SQL में JOIN लिखते हैं, तो इसका अर्थ अक्सर यह होता है कि एक तालिका दूसरी तालिका को संदर्भित करती है। उदाहरण के लिए, कार्य तालिका में एक कर्मचारी_आईडी कॉलम होता है जो कर्मचारी तालिका के आईडी कॉलम को संदर्भित करता है।

हाइबरनेट में एनोटेशन का उपयोग करके इस निर्भरता का वर्णन किया जा सकता है। सबसे पहले, आइए बस अपनी टेबल के लिए एंटिटी बनाएं। सबसे पहले, आइए कर्मचारी तालिका का वर्णन करें:

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

और कार्य तालिका के लिए कर्मचारी कार्य वर्ग :

@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हाइबरनेट को बताता है कि कई कर्मचारी टास्क इकाइयां एक कर्मचारी इकाई को संदर्भित कर सकती हैं ।

और एनोटेशन @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 एचक्यूएल में शामिल होने का उपयोग करना

और अब देखते हैं कि एचक्यूएल में संबंधित संस्थाओं को प्रश्न कैसे लिखें।

पहली स्थिति।

हमारे पास एक कर्मचारी (कर्मचारी) है और हम उसके कार्यों की एक सूची प्राप्त करना चाहते हैं। यहाँ वह क्वेरी 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();

इस प्रश्न में कर्मचारी कर्मचारी कार्य वर्ग का एक क्षेत्र है

स्थिति तीन।

सभी अनिर्दिष्ट कार्यों को निदेशक को सौंपें। SQL क्वेरी इस तरह दिखेगी:

UPDATE task SET employee_id = 4 WHERE employee_id IS NULL

और अब उसी प्रश्न को HQL में लिखते हैं:

update EmployeeTask set employee = :user where employee is null

अंतिम प्रश्न सबसे कठिन है। हमें आईडी, निदेशक पास करने की आवश्यकता है, लेकिन कर्मचारी टास्क क्लास में ऐसा फ़ील्ड नहीं है जहां आप आईडी लिख सकते हैं, इसके बजाय इसमें एक कर्मचारी फ़ील्ड होता है जहां आपको कर्मचारी प्रकार के ऑब्जेक्ट का संदर्भ निर्दिष्ट करने की आवश्यकता होती है।

हाइबरनेट में, क्वेरी ऑब्जेक्ट को पास किए गए क्वेरी पैरामीटर की मदद से इस समस्या को हल किया जाता है। और HQL में ही, ऐसे पैरामीटर एक कोलन के माध्यम से लिखे जाते हैं: :user. लेकिन हम इस बारे में थोड़ी देर बाद बात करेंगे।