ไฮเบอร์เนต - ค้นหาภาษา

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();