Hibernate Query Language (HQL) เป็นภาษาสืบค้นเชิงวัตถุคล้ายกับ SQL แต่ไม่ใช่การดำเนินการบนตารางและคอลัมน์ HQL เหมาะสำหรับวัตถุถาวรและคุณสมบัติของพวกเขา แบบสอบถาม HQL จะถูกแปลงจากไฮเบอร์เนตเป็นแบบสอบถาม SQL แบบดั้งเดิมซึ่งดำเนินการในฐานข้อมูลบนวงกลม
แม้ว่าจะเป็นไปได้ที่จะใช้ SQL ดั้งเดิมโดยตรงกับคำสั่ง SQL และ Hibernate แต่ก็ขอแนะนำให้ใช้ HQL เพื่อหลีกเลี่ยงความยุ่งยากของการพกพาฐานข้อมูลให้มากที่สุดเท่าที่จะเป็นไปได้และนำข้อดีของการสร้าง SQL และกลยุทธ์การแคช
คำหลักเช่นเลือกจากและที่ไหนที่มีความไวต่อตัวพิมพ์ใหญ่ แต่คุณสมบัติเช่นชื่อตารางและชื่อคอลัมน์มีความแตกต่างใน HQL ที่ไว
จากคำสั่ง
ใช้ส่วนจากประโยคหากคุณต้องการโหลดวัตถุถาวรที่สมบูรณ์ลงในหน่วยความจำ นี่คือไวยากรณ์ง่ายๆโดยใช้ประโยคจาก:
String HQL = "จากพนักงาน"; Query Query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();หากคุณต้องการที่จะผ่านการรับรองชื่อคลาสใน HQL เพียงระบุแพ็คเกจและชื่อคลาสต่อไปนี้:
String hql = "จาก com.hibernatebook.criteria.employee"; Query Query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
เป็นคำสั่ง
ประโยค AS สามารถใช้เพื่อจัดสรรนามแฝงให้กับการสืบค้น HQL ในชั้นเรียนโดยเฉพาะอย่างยิ่งเมื่อมีการสืบค้นที่ยาวมาก ตัวอย่างเช่นตัวอย่างสั้น ๆ ของเราด้านบนมีดังต่อไปนี้:
String hql = "จากพนักงานเป็น e"; query query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
คำหลักเป็นตัวเลือกและคุณยังสามารถระบุนามแฝงได้โดยตรงในชื่อคลาสที่ตามมาดังที่แสดงด้านล่าง:
String HQL = "จาก Employee E"; Query Query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
เลือกประโยค
ประโยคที่เลือกให้การควบคุมมากกว่าชุดผลลัพธ์ของประโยคจาก หากคุณต้องการได้รับคุณสมบัติหลายอย่างของวัตถุแทนวัตถุทั้งหมดให้ใช้ประโยคที่เลือก นี่คือไวยากรณ์ง่ายๆในการใช้คำสั่ง SELECT เพื่อรับวัตถุพนักงานเพียงฟิลด์ FIRST_NAME:
String hql = "เลือก e.firstname จากพนักงาน e"; query query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
เป็นที่น่าสังเกตว่าที่นี่ Employee.FirstName เป็นคุณลักษณะของวัตถุพนักงานไม่ใช่ฟิลด์ของตารางพนักงาน
ที่ประโยค
หากคุณต้องการ จำกัด วัตถุเฉพาะที่ส่งคืนจากที่เก็บข้อมูลคุณสามารถใช้ประโยคที่ นี่คือไวยากรณ์ง่ายๆโดยใช้ประโยคที่:
String HQL = "จากพนักงาน E โดยที่ E.ID = 10"; Query Query = Session.createquery (HQL); รายการผลลัพธ์ = query.list ();
สั่งซื้อตามประโยค
ในการเรียงลำดับผลลัพธ์ของการสืบค้น HQL คุณจะต้องใช้คำสั่งซื้อตามข้อ คุณสามารถเรียงลำดับผลลัพธ์ใน Ascending (ASC) หรือ DessCender (DESC) ในชุดผลลัพธ์โดยการเรียงลำดับผลลัพธ์ในแอตทริบิวต์ใด ๆ ของวัตถุ นี่คือไวยากรณ์ง่ายๆโดยใช้คำสั่งซื้อตามข้อ:
String hql = "จากพนักงาน e โดยที่ e.id> 10 คำสั่งซื้อโดย e.salary desc"; query query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
หากคุณต้องการจัดเรียงตามคุณสมบัติมากกว่าหนึ่งคุณสมบัติคุณจะเพิ่มคุณสมบัติเพิ่มเติมในตอนท้ายของคำสั่งคั่นด้วยประโยคที่มีเครื่องหมายจุลภาคดังที่แสดงด้านล่าง:
String hql = "จากพนักงาน e โดยที่ e.id> 10" + "คำสั่งซื้อโดย e.firstname desc, e.salary desc"; query query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
กลุ่มตามมาตรา
ข้อนี้ช่วยให้การสกัดข้อมูลจากฐานข้อมูลและกลุ่มของค่าแอตทริบิวต์ของไฮเบอร์เนตและมักจะใช้ผลลัพธ์เพื่อรวมค่ารวม นี่คือไวยากรณ์ง่ายๆโดยใช้กลุ่มตามข้อ:
String HQL = "SELECT SUM (E.Salary), E.FirtName จาก Employee E" + "กลุ่มโดย E.FirstName"; Query Query = Session.Createquery (HQL); รายการผลลัพธ์ = query.list ();
ใช้พารามิเตอร์ชื่อ
Hibernate ได้รับการสนับสนุนในพารามิเตอร์การสืบค้น HQL สิ่งนี้ทำให้ง่ายต่อการเขียนและยอมรับการป้อนข้อมูลจากผู้ใช้โดยไม่ต้องป้องกันการสืบค้น HQL เกี่ยวกับการโจมตีฉีด SQL นี่คือไวยากรณ์อย่างง่ายโดยใช้พารามิเตอร์ชื่อ:
String hql = "จากพนักงาน e โดยที่ e.id =: Employee_id"; Query Query = session.createquery (HQL); query.setParameter ("Employee_id", 10); รายการผลลัพธ์ = query.list (); อัปเดตประโยค
การอัปเดตแบบแบตช์เป็น HQL ใหม่ที่มี Hibernate3 และงานลบที่แตกต่างกันเช่นเดียวกับ Hibernate 3 และ Hibernate2 อินเตอร์เฟสแบบสอบถามตอนนี้มีวิธีการที่เรียกว่า ExecuteUpdate () สำหรับการดำเนินการอัปเดต HQL หรือลบคำสั่ง
ประโยคการอัปเดตสามารถใช้เพื่ออัปเดตคุณสมบัติอย่างน้อยหนึ่งรายการในวัตถุหนึ่งวัตถุขึ้นไป นี่คือไวยากรณ์ง่ายๆโดยใช้ประโยคการอัปเดต:
String HQL = "UPDATE EMPERITEE SET SALARY =: SALARY" + "โดยที่ id =: Employee_id"; Query Query = Session.createquery (HQL); query.setParameter ("เงินเดือน", 1000); query.setParameter ("ExplueE_ID", 10); ลบประโยค
ประโยคการลบสามารถใช้เพื่อลบวัตถุอย่างน้อยหนึ่งวัตถุ นี่คือไวยากรณ์ง่ายๆโดยใช้ประโยคลบ:
String hql = "ลบจากพนักงาน" + "โดยที่ id =: Employee_id"; query query = session.createquery (HQL); query.setParameter ("Employee_id", 10); int result = query.executeUpdate (); แทรกประโยค
HQL รองรับการแทรกลงในข้อที่มีเพียงบันทึกเท่านั้นที่สามารถแทรกจากวัตถุหนึ่งไปยังอีกวัตถุหนึ่ง นี่คือไวยากรณ์ง่ายๆโดยใช้ส่วนแทรกลงในข้อ:
String hql = "แทรกลงในพนักงาน (ชื่อแรก, นามสกุล, เงินเดือน)" + "เลือก FirstName, นามสกุล, เงินเดือนจาก old_employee"; Query Query = session.createquery (hql); int result = query.executeUpdate (); system.out.out.println (
วิธีการรวม
HQL รองรับวิธีการรวมหลายวิธีคล้ายกับ SQL พวกเขาทำงานใน HQL ในลักษณะเดียวกันใน SQL และรายการคุณสมบัติที่มีอยู่ต่อไปนี้:
คำหลักที่แตกต่างจะคำนวณค่าที่ไม่ซ้ำกันที่ตั้งไว้ในบรรทัดนี้เท่านั้น แบบสอบถามต่อไปนี้จะส่งคืนเพียงจำนวนที่ไม่ซ้ำกัน:
String hql = "เลือกนับ (e.firstname ที่แตกต่างกัน) จากพนักงาน e"; query query = session.createquery (HQL); รายการผลลัพธ์ = query.list ();
การใช้การพูดพล่ามแบบสอบถาม
มีสองวิธีสำหรับอินเทอร์เฟซการสืบค้นการปนเปื้อน
คุณสามารถสร้างส่วนประกอบเพจบนเว็บไซต์หรือแอปพลิเคชันสวิง นี่คือตัวอย่างคุณสามารถขยายได้เพื่อรับ 10 บรรทัด:
String hql = "จากพนักงาน"; Query Query = session.createquery (HQL); query.setFirStresult (1); query.setMaxResults (10); รายการผลลัพธ์ = query.list ();
เกณฑ์การสอบถาม
Hibernate เป็นวิธีอื่นในการใช้งานวัตถุและข้อมูลตามลำดับที่มีอยู่ในตาราง RDBMS หนึ่งในวิธีการคือ API มาตรฐานซึ่งช่วยให้คุณสามารถสร้างการเขียนโปรแกรมวัตถุแบบสอบถามมาตรฐานที่สามารถใช้กฎการกรองและเงื่อนไขเชิงตรรกะ
อินเทอร์เฟซเซสชันของ Hibernate ให้อินสแตนซ์ของคลาสที่สามารถใช้ในการสร้างวัตถุถาวรที่ส่งคืนและแอปพลิเคชันจะดำเนินการสืบค้นแบบมีเงื่อนไขไปยังเมธอด createCriteria ()
ต่อไปนี้เป็นตัวอย่างของการสืบค้นแบบมีเงื่อนไขที่ง่ายที่สุดซึ่งจะส่งคืนแต่ละวัตถุที่สอดคล้องกับคลาสพนักงาน
เกณฑ์ cr = session.createCriteria (Employee.class); รายการผลลัพธ์ = cr.list ();
ข้อ จำกัด และมาตรฐาน:
คุณสามารถใช้วิธี Add () เพื่อเพิ่มแบบสอบถามข้อ จำกัด โดยใช้วัตถุเกณฑ์ นี่คือตัวอย่างของการเพิ่มขีด จำกัด ด้วยบันทึกการส่งคืนเงินเดือนเท่ากับ 2000:
เกณฑ์ cr = session.createCriteria (Employee.class); cr.add (ข้อ จำกัด eq ("เงินเดือน", 2000)); รายการผลลัพธ์ = cr.list ();นี่คือตัวอย่างบางส่วนที่ครอบคลุมสถานการณ์ที่แตกต่างกันและสามารถใช้ตามที่ต้องการ:
เกณฑ์ cr = session.createCriteria (Employee.class); // เพื่อรับบันทึกที่มีเงินเดือนมากกว่า 2000cr.add (ข้อ จำกัด . gt ("เงินเดือน", 2000)); // เพื่อรับบันทึกที่มีเงินเดือนน้อยกว่า 2000cr.add zaracr.add (ข้อ จำกัด เหมือน ("FirstName", "zara%")); // รูปแบบที่ละเอียดอ่อนของข้อ จำกัด ด้านบน ccr.add (ข้อ จำกัด . ilike ("firstname", "zara%"); nullcr.add (ข้อ จำกัด isnull ("เงินเดือน")); // เพื่อตรวจสอบว่าทรัพย์สินที่กำหนดไม่ใช่ nullcr.add (ข้อ จำกัด หรือไม่ ("เงินเดือน")); // เพื่อตรวจสอบว่าทรัพย์สินที่กำหนดนั้นว่างเปล่า คุณสามารถสร้างและหรือ ORS เพื่อใช้ LogicalExpression เพื่อ จำกัด เงื่อนไขต่อไปนี้: Criteria Cr = Session.createCriteria (Employee.class); เกณฑ์เงินเดือน = ข้อ จำกัด . gt ("เงินเดือน", 2000); ชื่อเกณฑ์ = ข้อ จำกัด . ilike ("firstName", "zara%"); // เพื่อรับบันทึกการจับคู่กับ OR หรือ ConditionionsLogicalExpression orexp = ข้อ จำกัด หรือเงินเดือนชื่อ); cr.add (orexp); // Cr.List ();แม้ว่าเงื่อนไขทั้งหมดข้างต้นสามารถนำมาใช้โดยตรงโดยใช้ HQL ในบทช่วยสอนก่อนหน้า
มาตรฐานการใช้งานเพจ:
นอกจากนี้ยังมีอินเทอร์เฟซมาตรฐานสองวิธีสำหรับการปนเปื้อน
เมื่อรวมกับสองวิธีข้างต้นเราสามารถสร้างส่วนประกอบเพจบนเว็บไซต์ของเราหรือแอปพลิเคชันสวิง นี่คือตัวอย่างที่สามารถขยายได้เพื่อรับ 10 แถวต่อครั้ง:
เกณฑ์ cr = session.createCriteria (Employee.class); cr.setFirstResult (1); cr.setMaxResults (10); รายการผลลัพธ์ = cr.list ();
เรียงลำดับผลลัพธ์:
API มาตรฐานให้ org.hibernate.criterion.order คลาสการเรียงลำดับผลลัพธ์ของคุณตั้งค่าตามลำดับจากน้อยไปมากหรือจากมากไปน้อยตามคุณสมบัติของวัตถุ ตัวอย่างนี้แสดงวิธีการเรียงลำดับโดยใช้ชุดผลลัพธ์ของคลาสลำดับ:
เกณฑ์ cr = session.createCriteria (Employee.class); // เพื่อรับบันทึกที่มียอดขายมากกว่า 2000cr.add (ข้อ จำกัด . gt ("เงินเดือน", 2000)); // เพื่อจัดเรียงบันทึกใน ordercrit.addorder (order.desc) Cr.List (); การทำนายและการรวม:
เกณฑ์ API ให้ org.hibernate.criterion.projections คลาสที่สามารถใช้เพื่อรับค่าเฉลี่ยแอตทริบิวต์เฉลี่ยสูงสุดหรือต่ำสุด คลาสการคาดการณ์นั้นคล้ายกับข้อ จำกัด ของคลาสเนื่องจากมีวิธีการโรงงานคงที่หลายวิธีสำหรับการได้รับอินสแตนซ์การฉายภาพ ให้
นี่คือตัวอย่างที่เกี่ยวข้องกับแผนการต่าง ๆ ที่สามารถใช้ตามที่กำหนดไว้:
เกณฑ์ cr = session.createCriteria (Employee.class); // เพื่อรับจำนวนแถวทั้งหมด cr.setprojection (projections.rowcount ()); // เพื่อรับค่าเฉลี่ยของคุณสมบัติ cr.setprojection (projections.avg ("เงินเดือน"); // property.cr.setprojection (projections.max ("เงินเดือน")); // เพื่อรับขั้นต่ำของคุณสมบัติ cr.setprojection (projections.min ("เงินเดือน")); // เพื่อรับผลรวมของคุณสมบัติ ccr.setprojection (projections.sum ("เงินเดือน")); เกณฑ์การสอบถามตัวอย่าง:
พิจารณาคลาส Pojo ต่อไปนี้:
พนักงานชั้นเรียนสาธารณะ {ID INT ส่วนตัว; สตริงส่วนตัวชื่อแรก; สตริงส่วนตัวนามสกุล; เงินเดือนส่วนตัว พนักงานสาธารณะ () {} พนักงานสาธารณะ (สตริง fname, สตริง lname, เงินเดือน int) {this.firstname = fname; this.lastName = lName; this.salary = เงินเดือน; } สาธารณะ int getId () {return id; } โมฆะสาธารณะ setId (int id) {this.id = id; } สตริงสาธารณะ getFirstName () {return firstName; } โมฆะสาธารณะ setFirstName (สตริง first_name) {this.firstName = first_name; } สตริงสาธารณะ getLaStName () {return lastName; } โมฆะสาธารณะ setLastName (สตริง last_name) {this.lastName = last_name; } public int getalary () {คืนเงินเดือน; } โมฆะสาธารณะ setSalary (เงินเดือน int) {this.salary = เงินเดือน; -มาสร้างตารางพนักงานต่อไปนี้เพื่อจัดเก็บวัตถุพนักงาน:
สร้างพนักงานตาราง (ID int ไม่ใช่ null auto_increment, first_name varchar (20) ค่าเริ่มต้น null, last_name varchar (20) ค่าเริ่มต้น null, เงินเดือน int เริ่มต้น null, คีย์หลัก (id));
ต่อไปนี้จะถูกแมปไฟล์
<? XML เวอร์ชัน = "1.0" การเข้ารหัส = "UTF-8"?> <! Doctype Hibernate-Mapping สาธารณะ "-// hibernate/hibernate mapping dtd // en" "http://www.hibernate.org/dtd/hibernate-mapping-3 table = "พนักงาน"> <meta attribute = "Class-Description"> คลาสนี้มีรายละเอียดของพนักงาน </meta> <id name = "id" type = "int" คอลัมน์ = "id"> <generator/> </id> <property name = "FirstName" คอลัมน์ = "First_name" type = "String"/> <property name = "LastName" Column = "Last_name" Type = "String"/> <
ในที่สุดเราจะสร้างวิธีการหลัก () ของคลาสแอปพลิเคชันที่จะเรียกใช้และเราจะใช้เกณฑ์การสืบค้นสำหรับแอปพลิเคชัน:
นำเข้า java.util.list; นำเข้า java.util.date; นำเข้า java.util.iterator; นำเข้า org.hibernate.HibernateException; นำเข้า org.hibernate.session; นำเข้า org.hibernate.transaction; นำเข้า org.hibernate.sessionfactory; นำเข้า org.hibernate.criteria; นำเข้า org.hibernate.criterion.restrictions; นำเข้า org.hibernate.criterion.projections; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {โรงงาน = การกำหนดค่าใหม่ (). configure (). buildSessionFactory (); } catch (throwable ex) {system.err.println ("ล้มเหลวในการสร้างวัตถุ SessionFactory" + ex); โยนข้อยกเว้นใหม่ IniniNitializerError (EX); } managemployee me = new Managemployee (); / * เพิ่มระเบียนพนักงานไม่กี่รายในฐานข้อมูล */ จำนวนเต็ม EMPID1 = Me.addemployee ("Zara", "Ali", 2000); จำนวนเต็ม Empid2 = me.addemployee ("Daisy", "Das", 5000); จำนวนเต็ม empid3 = me.addemployee ("John", "Paul", 5000); จำนวนเต็ม empid4 = me.addemployee ("mohd", "yasee", 3000); / * แสดงรายการพนักงานทั้งหมด */ me.listemployee (); / * พิมพ์จำนวนพนักงานทั้งหมด */ me.countemployee (); / * พิมพ์เงินเดือน toatl */ me.totalsalary (); } / * วิธีการสร้างพนักงานในฐานข้อมูล * / addemployee จำนวนเต็มสาธารณะ (สตริง fname, สตริง lname, เงินเดือน int) {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; จำนวนเต็ม EmployeeId = null; ลอง {tx = session.beginTransaction (); พนักงานพนักงาน = พนักงานใหม่ (fname, lname, เงินเดือน); EmployeeId = (จำนวนเต็ม) เซสชั่น SAVE (พนักงาน); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); } return EmployeeId; } / * วิธีการอ่านพนักงานทุกคนที่มีเงินเดือนมากกว่า 2000 * / void listemployees () {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); เกณฑ์ cr = session.createCriteria (Employee.class); // เพิ่มข้อ จำกัด Cr.Add (ข้อ จำกัด . gt ("เงินเดือน", 2000)); รายชื่อพนักงาน = cr.list (); สำหรับ (iterator iterator = พนักงาน. titerator (); iterator.hasnext ();) {พนักงานพนักงาน = (พนักงาน) iterator.next (); System.out.print ("ชื่อแรก:" + Employee.getFirstName ()); System.out.print ("นามสกุล:" + Employee.getLastName ()); System.out.println ("เงินเดือน:" + Employee.getSalary ()); } tx.Commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * เมธอดในการพิมพ์จำนวนระเบียนทั้งหมด * / โมฆะสาธารณะ countemployee () {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); เกณฑ์ cr = session.createCriteria (Employee.class); // เพื่อรับจำนวนแถวทั้งหมด cr.setprojection (projections.rowcount ()); รายการ rowCount = cr.list (); System.out.println ("Coint Total:" + rowcount.get (0)); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); }} / * วิธีการพิมพ์ผลรวมของเงินเดือน * / โมฆะสาธารณะ totalsalary () {เซสชันเซสชัน = factory.opensession (); ธุรกรรม tx = null; ลอง {tx = session.beginTransaction (); เกณฑ์ cr = session.createCriteria (Employee.class); // เพื่อรับเงินเดือนทั้งหมด cr.setprojection (projections.sum ("เงินเดือน")); รายการ totalsalary = cr.list (); System.out.println ("รวมเงินเดือน:" + totalsalary.get (0)); tx.commit (); } catch (hibernateException e) {ถ้า (tx! = null) tx.rollback (); E.PrintStackTrace (); } ในที่สุด {session.close (); - รวบรวมและดำเนินการ:
นี่คือขั้นตอนในการรวบรวมและเรียกใช้แอปพลิเคชันด้านบน โปรดตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า PATH และ ClassPath อย่างเหมาะสมก่อนที่จะรวบรวมและดำเนินการ
ผลลัพธ์ต่อไปนี้จะได้รับและบันทึกจะถูกสร้างขึ้นในตารางพนักงาน
$ java managemployee
..... ข้อความบันทึกต่าง ๆ จะแสดงที่นี่ ......... ชื่อแรก: Daisy นามสกุล: DAS เงินเดือน: 5000 FIRST NAME: จอห์นนามสกุล: PAUL เงินเดือน: 5000 FIRST ชื่อ: MOHD นามสกุล: YASEE เงินเดือน: 3000TOTAL COINT: 4TOTAL เงินเดือน: 15000
หากคุณตรวจสอบตารางพนักงานควรบันทึกดังนี้:
mysql> เลือก * จากพนักงาน;
- id | first_name | Last_name | เงินเดือน -