1.1 รู้เบื้องต้นเกี่ยวกับ HQL

ก่อนหน้านี้ คุณคุ้นเคยกับ Hibernate แล้ว และตอนนี้ฉันจะแนะนำให้คุณรู้จักกับHQL หรือที่รู้จักในชื่อHibernate Query Language ในความเป็นจริง นี่คือ SQL ที่แปลงสำหรับการเขียนแบบสอบถามในไฮเบอร์เนต มีความแตกต่างที่สำคัญหลายประการ

  1. โดยใช้ชื่อคลาสแทนชื่อตาราง
  2. การใช้ชื่อเขตข้อมูลคลาสแทนชื่อคอลัมน์ตาราง
  3. การใช้ ตัวเลือกที่เลือก

ขอให้ไฮเบอร์เนตส่งคืนผู้ใช้ทั้งหมดที่มีในฐานข้อมูลให้เรา นี่คือลักษณะของคำขอนั้น:

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