1.1 รู้เบื้องต้นเกี่ยวกับ HQL
ก่อนหน้านี้ คุณคุ้นเคยกับ Hibernate แล้ว และตอนนี้ฉันจะแนะนำให้คุณรู้จักกับHQL หรือที่รู้จักในชื่อHibernate Query Language ในความเป็นจริง นี่คือ SQL ที่แปลงสำหรับการเขียนแบบสอบถามในไฮเบอร์เนต มีความแตกต่างที่สำคัญหลายประการ
- โดยใช้ชื่อคลาสแทนชื่อตาราง
- การใช้ชื่อเขตข้อมูลคลาสแทนชื่อคอลัมน์ตาราง
- การใช้ ตัวเลือกที่เลือก
ขอให้ไฮเบอร์เนตส่งคืนผู้ใช้ทั้งหมดที่มีในฐานข้อมูลให้เรา นี่คือลักษณะของคำขอนั้น:
from User
นั่นคือทั้งหมดสำหรับการเปรียบเทียบ เรานำเสนอแบบสอบถามที่คล้ายกันใน SQL:
select * from user
นี่User
คือชื่อของคลาส และuser
เป็นชื่อของตาราง
โค้ด Java ที่สมบูรณ์จะมีลักษณะดังนี้:
public List<User> getAllUsers() {
try (Session session = sessionFactory.openSession()) {
return session.createQuery("from User", User.class).list();
}
}
มิฉะนั้น HQL จะคล้ายกับ SQL มาก - มันมีตัวดำเนินการด้วย:
WHERE
ORDER BY
GROUP BY
HAVING
1.2 ตัวอย่างการทำงานกับ HQL
บางทีตัวอย่างก่อนหน้านี้อาจทำให้สับสนเล็กน้อยเนื่องจากชื่อตารางและฟิลด์เดียวกัน เรามายกตัวอย่างพิเศษซึ่งจะง่ายกว่านี้
สมมติว่าเรามี ตาราง user_dataที่มีฟิลด์ต่อไปนี้:
- รหัส INT
- ชื่อผู้ใช้ VARCHAR(100)
- user_level INT
- user_createdวันที่
เราจะสร้างคลาส Java ที่จะจับคู่กับตารางนี้:
@Entity
@Table(name="user_data")
class User {
@Id
@GeneratedValue
public Integer id;
@Column(name="user_name")
public String name;
@Column(name="user_level")
public Integer level;
@Column(name="user_created")
public Date created;
}
ตอนนี้ลองเขียนตัวอย่าง:
HQL | เอสคิวแอล |
---|---|
จากผู้ใช้ | เลือก * จาก user_data |
จากผู้ใช้โดยที่ id=3 | เลือก * จาก user_data โดยที่ id=3 |
จากผู้ใช้ที่ระดับใน (10,20,30) | เลือก * จาก user_data โดยที่ user_level IN (10, 20, 30) |
จากคำสั่งของผู้ใช้โดยสร้างเป็น | เลือก * จากลำดับ user_data โดย user_created asc |
จากผู้ใช้ที่ชื่อเหมือน 'ทดสอบ' | เลือก * จาก user_data โดยที่ user_name เช่น 'ทดสอบ' |
ข้อความค้นหาจะคล้ายกันมาก และการอ่านข้อความค้นหา HQL เมื่อคุณคุ้นเคยกับชื่อคลาสและฟิลด์ของชื่อคลาสนั้นง่ายพอๆ กับการอ่านข้อความค้นหา SQL การเขียนอาจจะยากขึ้นเล็กน้อย แต่คำถามที่ซับซ้อนมากมักไม่ค่อยเขียนใน HQL
1.3 การใช้การเลือก
ใน HQL คุณสามารถใช้select
เมื่อประเภทข้อมูลของผลลัพธ์ไม่ตรงกับประเภทที่ระบุfrom
ใน
ตัวอย่างเช่น เราต้องการรับชื่อของผู้ใช้ทั้งหมดที่อยู่ใน ตาราง user_data ของเรา จากนั้นเราต้องเขียนข้อความค้นหาต่อไปนี้:
select name from User
นอกจากนี้ หากมีชื่อซ้ำกัน คุณสามารถใช้โอเปอเรเตอร์DISTINCT
:
select distinct name from User
นามแฝงทำงานเหมือนกับใน SQL:
select distinct u.name from User u where u.created > '2020-01-01'
ในรูปแบบของโค้ด Java อย่างสมบูรณ์ คำขอนี้จะมีลักษณะดังนี้:
public List<String> getUserNames() {
try (Session session = sessionFactory.openSession()) {
String hql = "select distinct u.name from User u where u.created > '2020-01-01'";
Query<String> query = session.createQuery(hql , String.class);
return query.list();
}
}
โปรดทราบว่าแบบสอบถามต้องส่งคืนรายชื่อ ชื่อเป็นประเภท String ดังนั้นทั้งประเภทของฟังก์ชันและพารามิเตอร์ประเภทของคลาส Query จึงเป็นประเภท String
GO TO FULL VERSION