3.1 மேப்பிங் சார்ந்த நிறுவனங்கள்
SQL இல், நீங்கள் JOIN ஐப் பயன்படுத்தி வினவல்களை எழுதலாம். HQL இல் இதையே செய்ய முடியுமா? குறுகிய பதில் ஆம். ஆனால் முழு பதில் இன்னும் சுவாரஸ்யமாக இருக்கும்.
முதலில், நாம் 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;
}
பணி அட்டவணைக்கான 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;
}
எல்லாம் நன்றாக இருக்கிறது, ஆனால் ஒரு பரிந்துரை உள்ளது. கடைசி எடுத்துக்காட்டில் EmployeeId புலத்தைப் பார்ப்போம் :
@Column(name="employee_id")
public Integer employeeId;
விசித்திரமான ஒன்றை நீங்கள் கவனிக்கிறீர்களா? இல்லையெனில், நீங்கள் ஏற்கனவே SQL மொழியில் சிந்திக்கும் முறையை உருவாக்கியுள்ளீர்கள் என்று அர்த்தம்.
விஷயம் என்னவென்றால், ஜாவா மொழியில், பொதுவாக இதுபோன்ற சார்புநிலையை சற்று வித்தியாசமாக விவரிக்கிறோம்:
public Employee employee;
நாங்கள் ஒரு ஐடியைக் குறிப்பிடத் தேவையில்லை , பொதுவாக பணியாளர் பொருளின் குறிப்பைக் கொண்ட ஒரு மாறியைக் குறிப்பிடுவோம் . அல்லது அத்தகைய பொருள் இல்லை என்றால் பூஜ்யமாக சேமிக்கிறது.
சிறுகுறிப்புகளைப் பயன்படுத்தி அத்தகைய சூழ்நிலையை விவரிக்க ஹைபர்னேட் அனுமதிக்கிறது:
@ManyToOne
@JoinColumn(name="employee_id", nullable=true)
public Employee employee;
சிறுகுறிப்பு @ManyToOne
Hibernate க்கு பல 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
. ஆனால் இதைப் பற்றி சிறிது நேரம் கழித்து பேசுவோம்.
GO TO FULL VERSION