3.1 ম্যাপিং নির্ভরশীল সত্তা

SQL এ, আপনি JOIN ব্যবহার করে প্রশ্ন লিখতে পারেন। HQL এ কি একই কাজ করা সম্ভব? সংক্ষিপ্ত উত্তর হল হ্যাঁ. কিন্তু সম্পূর্ণ উত্তর আরো আকর্ষণীয় হবে।

প্রথমত, যখন আমরা এসকিউএল-এ একটি 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;
}

এবং টাস্ক টেবিলের জন্য 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;

আমাদের একটি আইডি নির্দিষ্ট করার দরকার নেই , আমরা সাধারণত শুধুমাত্র একটি ভেরিয়েবল নির্দিষ্ট করি যা 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 এ সম্পর্কিত সত্ত্বাকে প্রশ্ন লিখতে হয়।

প্রথম অবস্থা।

আমাদের একজন কর্মচারী (কর্মচারী) আছে এবং আমরা তার কাজের তালিকা পেতে চাই। এসকিউএল-এ সেই প্রশ্নটি দেখতে কেমন হবে তা এখানে:

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 ক্লাসে একটি কর্মচারী ক্ষেত্র রয়েছে এবং এটির একটি নাম ক্ষেত্র রয়েছে , তাই এই প্রশ্নটি কাজ করবে।

পরিস্থিতি দুই।

যাদের অতিরিক্ত কাজ আছে তাদের একটি তালিকা ফেরত দিন। এসকিউএল-এ সেই প্রশ্নটি দেখতে কেমন হবে তা এখানে:

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 ক্লাসে এমন একটি ক্ষেত্র নেই যেখানে আপনি id লিখতে পারেন, পরিবর্তে এটিতে একটি Employee ক্ষেত্র রয়েছে যেখানে আপনাকে Employee ধরনের একটি বস্তুর জন্য একটি রেফারেন্স বরাদ্দ করতে হবে।

হাইবারনেটে, এই সমস্যাটি ক্যোয়ারী পরামিতিগুলির সাহায্যে সমাধান করা হয় যা কোয়েরি অবজেক্টে পাস করা হয়। এবং HQL নিজেই, এই ধরনের পরামিতিগুলি একটি কোলনের মাধ্যমে লেখা হয়: :user. তবে আমরা এই বিষয়ে একটু পরে কথা বলব।