ไฮเบอร์เนต - ค้นหาภาษา
Hibernate Query Language (HQL) เป็นภาษาเคียวรีเชิงวัตถุคล้ายกับ SQL แต่แทนที่จะทำงานบนตารางและคอลัมน์ HQL จะทำงานกับอ็อบเจ็กต์แบบถาวรและคุณสมบัติของมัน แบบสอบถาม HQL ถูกแปลโดย Hibernate เป็นแบบสอบถาม SQL ทั่วไปซึ่งจะดำเนินการกับฐานข้อมูล
แม้ว่าคุณจะสามารถใช้คำสั่ง SQL โดยตรงกับ Hibernate โดยใช้ Native SQL แต่ฉันขอแนะนำให้ใช้ HQL ทุกครั้งที่ทำได้เพื่อหลีกเลี่ยงความยุ่งยากในการเคลื่อนย้ายฐานข้อมูลและเพื่อใช้ประโยชน์จากกลยุทธ์การสร้าง SQL และแคชของ Hibernate
คีย์เวิร์ดเช่น SELECT, FROM และ WHERE เป็นต้นไม่คำนึงถึงขนาดตัวพิมพ์ แต่คุณสมบัติเช่นชื่อตารางและคอลัมน์จะพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ใน HQL
จากข้อ
คุณจะใช้ FROMประโยคถ้าคุณต้องการโหลดอ็อบเจ็กต์ถาวรที่สมบูรณ์ลงในหน่วยความจำ ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้ FROM clause -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
List results = query.list();
หากคุณต้องการคุณสมบัติชื่อคลาสใน HQL อย่างสมบูรณ์เพียงระบุแพ็กเกจและชื่อคลาสดังนี้ -
String hql = "FROM com.hibernatebook.criteria.Employee";
Query query = session.createQuery(hql);
List results = query.list();
เป็นข้อ
ASสามารถใช้ clause เพื่อกำหนดนามแฝงให้กับคลาสในแบบสอบถาม HQL ของคุณโดยเฉพาะอย่างยิ่งเมื่อคุณมีคิวรียาว ๆ ตัวอย่างเช่นตัวอย่างง่ายๆก่อนหน้านี้ของเราจะเป็นดังต่อไปนี้ -
String hql = "FROM Employee AS E";
Query query = session.createQuery(hql);
List results = query.list();
AS คีย์เวิร์ดเป็นทางเลือกและคุณยังสามารถระบุนามแฝงหลังชื่อคลาสได้โดยตรงดังนี้ -
String hql = "FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
เลือกประโยค
SELECTอนุประโยคให้การควบคุมชุดผลลัพธ์มากขึ้นจากนั้นจากอนุประโยค หากคุณต้องการรับคุณสมบัติบางอย่างของอ็อบเจ็กต์แทนที่จะเป็นอ็อบเจ็กต์ที่สมบูรณ์ให้ใช้ส่วนคำสั่ง SELECT ต่อไปนี้เป็นไวยากรณ์อย่างง่ายของการใช้คำสั่ง SELECT เพื่อรับฟิลด์ first_name ของอ็อบเจ็กต์พนักงาน -
String hql = "SELECT E.firstName FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
เป็นที่น่าสังเกตว่า Employee.firstName เป็นคุณสมบัติของอ็อบเจ็กต์ Employee แทนที่จะเป็นฟิลด์ของตาราง EMPLOYEE
WHERE ข้อ
ถ้าคุณต้องการ จำกัด ออบเจ็กต์เฉพาะที่ส่งคืนจากที่เก็บข้อมูลให้แคบลงให้ใช้คำสั่ง WHERE ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้คำสั่ง WHERE -
String hql = "FROM Employee E WHERE E.id = 10";
Query query = session.createQuery(hql);
List results = query.list();
สั่งซื้อตามข้อ
ในการจัดเรียงผลลัพธ์ของแบบสอบถาม HQL ของคุณคุณจะต้องใช้ไฟล์ ORDER BYอนุประโยค คุณสามารถจัดลำดับผลลัพธ์โดยคุณสมบัติใด ๆ บนวัตถุในชุดผลลัพธ์จากน้อยไปมาก (ASC) หรือจากมากไปหาน้อย (DESC) ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้คำสั่ง ORDER BY -
String hql = "FROM Employee E WHERE E.id > 10 ORDER BY E.salary DESC";
Query query = session.createQuery(hql);
List results = query.list();
หากคุณต้องการจัดเรียงตามคุณสมบัติมากกว่าหนึ่งรายการคุณก็แค่เพิ่มคุณสมบัติเพิ่มเติมที่ส่วนท้ายของคำสั่งตามอนุประโยคโดยคั่นด้วยลูกน้ำดังนี้ -
String hql = "FROM Employee E WHERE E.id > 10 " +
"ORDER BY E.firstName DESC, E.salary DESC ";
Query query = session.createQuery(hql);
List results = query.list();
จัดกลุ่มตามข้อ
ประโยคนี้ช่วยให้ Hibernate ดึงข้อมูลจากฐานข้อมูลและจัดกลุ่มตามค่าของแอตทริบิวต์และโดยทั่วไปจะใช้ผลลัพธ์เพื่อรวมค่าการรวม ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้ GROUP BY clause -
String hql = "SELECT SUM(E.salary), E.firtName FROM Employee E " +
"GROUP BY E.firstName";
Query query = session.createQuery(hql);
List results = query.list();
การใช้พารามิเตอร์ที่มีชื่อ
Hibernate รองรับพารามิเตอร์ที่มีชื่อในการสืบค้น HQL สิ่งนี้ทำให้การเขียนแบบสอบถาม HQL ที่ยอมรับอินพุตจากผู้ใช้เป็นเรื่องง่ายและคุณไม่จำเป็นต้องป้องกันการโจมตีด้วยการฉีด SQL ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้พารามิเตอร์ที่มีชื่อ -
String hql = "FROM Employee E WHERE E.id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id",10);
List results = query.list();
ปรับปรุงข้อ
การอัปเดตจำนวนมากเป็นสิ่งใหม่สำหรับ HQL ที่มี Hibernate 3 และการลบการทำงานใน Hibernate 3 แตกต่างจากที่ทำใน Hibernate 2 ขณะนี้อินเทอร์เฟซ Query มีวิธีการที่เรียกว่า executeUpdate () สำหรับการเรียกใช้คำสั่ง HQL UPDATE หรือ DELETE
UPDATEสามารถใช้ clause เพื่ออัพเดตคุณสมบัติอย่างน้อยหนึ่งอย่างของอ็อบเจ็กต์หนึ่งหรือหลายอ็อบเจ็กต์ ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้ UPDATE clause -
String hql = "UPDATE Employee set salary = :salary " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("salary", 1000);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
ลบประโยค
DELETEอนุประโยคสามารถใช้เพื่อลบวัตถุอย่างน้อยหนึ่งชิ้น ต่อไปนี้เป็นไวยากรณ์อย่างง่ายของการใช้ DELETE clause -
String hql = "DELETE FROM Employee " +
"WHERE id = :employee_id";
Query query = session.createQuery(hql);
query.setParameter("employee_id", 10);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
แทรกข้อ
รองรับ HQL INSERT INTOอนุประโยคเฉพาะที่สามารถแทรกระเบียนจากวัตถุหนึ่งไปยังวัตถุอื่น ต่อไปนี้เป็นไวยากรณ์ง่ายๆของการใช้คำสั่ง INSERT INTO -
String hql = "INSERT INTO Employee(firstName, lastName, salary)" +
"SELECT firstName, lastName, salary FROM old_employee";
Query query = session.createQuery(hql);
int result = query.executeUpdate();
System.out.println("Rows affected: " + result);
วิธีการรวม
HQL รองรับวิธีการรวมที่หลากหลายเช่นเดียวกับ SQL พวกเขาทำงานในลักษณะเดียวกันใน HQL เช่นเดียวกับใน SQL และต่อไปนี้คือรายการฟังก์ชันที่มี -
ซีเนียร์ | ฟังก์ชั่นและคำอธิบาย |
---|---|
1 | avg(property name) ค่าเฉลี่ยของมูลค่าทรัพย์สิน |
2 | count(property name or *) จำนวนครั้งที่คุณสมบัติเกิดขึ้นในผลลัพธ์ |
3 | max(property name) ค่าสูงสุดของค่าคุณสมบัติ |
4 | min(property name) ค่าต่ำสุดของค่าคุณสมบัติ |
5 | sum(property name) ผลรวมของค่าคุณสมบัติ |
distinctคำหลักจะนับเฉพาะค่าที่ไม่ซ้ำกันในชุดแถว ข้อความค้นหาต่อไปนี้จะส่งคืนเฉพาะจำนวนที่ไม่ซ้ำกัน -
String hql = "SELECT count(distinct E.firstName) FROM Employee E";
Query query = session.createQuery(hql);
List results = query.list();
การแบ่งหน้าโดยใช้แบบสอบถาม
อินเทอร์เฟซแบบสอบถามสำหรับการแบ่งหน้ามีสองวิธี
ซีเนียร์ | วิธีการและคำอธิบาย |
---|---|
1 | Query setFirstResult(int startPosition) วิธีนี้ใช้จำนวนเต็มที่แสดงถึงแถวแรกในชุดผลลัพธ์ของคุณโดยเริ่มจากแถว 0 |
2 | Query setMaxResults(int maxResult) วิธีนี้จะบอกให้ Hibernate ดึงตัวเลขคงที่ maxResults ของวัตถุ |
ด้วยการใช้สองวิธีข้างต้นร่วมกันเราสามารถสร้างส่วนประกอบการเพจในเว็บหรือแอปพลิเคชัน Swing ของเรา ต่อไปนี้เป็นตัวอย่างซึ่งคุณสามารถขยายเพื่อดึงข้อมูลครั้งละ 10 แถว -
String hql = "FROM Employee";
Query query = session.createQuery(hql);
query.setFirstResult(1);
query.setMaxResults(10);
List results = query.list();