لغة الاستعلام Hibernate (HQL) هي لغة استعلام موجهة نحو الكائنات مماثلة لـ SQL ، ولكن ليس العمليات على الجداول والأعمدة. HQL مناسب للكائنات المستمرة وخصائصها. يتم تحويل استعلامات HQL من السبات إلى استعلامات SQL التقليدية ، والتي تؤدي عمليات على قاعدة البيانات على الدائرة.
على الرغم من أنه من الممكن استخدام SQL الأصلي مباشرة مع عبارات SQL و Hibernate ، إلا أنه يوصى باستخدام HQL لتجنب متاعب قابلية نقل قاعدة البيانات قدر الإمكان وتبني مزايا توليد SQL و Caching في السبات.
الكلمات الرئيسية مثل SELECT ، من وأين تكون حساسة للحالة ، ولكن الخصائص مثل أسماء الجدول وأسماء الأعمدة تتميز بحساسية HQL.
من البيان
استخدم البند من إذا كنت ترغب في تحميل كائن ثابت كامل في الذاكرة. فيما يلي بناء جملة بسيط باستخدام البند من:
String HQL = "من الموظف" ؛ استعلام الاستعلام = session.createquery (HQL) ؛ قائمة النتائج = Query.List () ؛إذا كنت بحاجة إلى تأهيل اسم فئة بالكامل في HQL ، فما عليك سوى تحديد الحزمة واسم الفصل التالي:
String hql = "from com.hibernatebook.criteria.employee" ؛ Query Query = Session.Createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
كبيان
يمكن استخدام البند AS لتخصيص الاسم المستعار لاستفسارات HQL في الفصل ، خاصةً عندما تكون هناك استفسارات طويلة جدًا. على سبيل المثال ، أمثلةنا الموجزة أعلاه هي ما يلي:
String HQL = "من الموظف AS e" ؛ استعلام Query = Session.Createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
الكلمة الرئيسية AS اختيارية ، ويمكنك أيضًا تحديد الاسم المستعار مباشرة في اسم الفئة اللاحقة ، كما هو موضح أدناه:
String HQL = "من الموظف E" ؛ استعلام Query = Session.Createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
حدد جملة
يوفر شرط SELECT تحكمًا أكبر من مجموعة النتائج من البند. إذا كنت ترغب في الحصول على عدة خصائص للكائن بدلاً من الكائن بأكمله ، فاستخدم جملة SELECT. فيما يلي بناء جملة بسيط لاستخدام عبارة محددة للحصول على كائن الموظف فقط First_Name Field:
String HQL = "SELECT E.FIRSTNAME من الموظف E" ؛ استعلام الاستعلام = session.createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
تجدر الإشارة إلى أنه هنا ، الموظف.
حيث جملة
إذا كنت ترغب في تضييق الكائن المحدد الذي يتم إرجاعه من التخزين ، فيمكنك استخدام الشرط الذي. فيما يلي بناء جملة بسيط باستخدام جملة WHERE:
String HQL = "من الموظف e حيث e.id = 10" ؛ استعلام الاستعلام = session.createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
الترتيب حسب الشر
لفرز نتائج استعلام HQL ، ستحتاج إلى استخدام الترتيب حسب الجملة. يمكنك فرز النتائج في تصاعدي (ASC) أو النزول (DESC) في النتيجة المحددة عن طريق فرز النتائج في أي سمة للكائن. فيما يلي بناء جملة بسيط باستخدام الترتيب بواسطة البند:
String HQL = "من الموظف e حيث e.id> 10 order بواسطة e.salary desc" ؛ استعلام الاستعلام = session.createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
إذا كنت ترغب في الفرز بأكثر من خاصية واحدة ، فستضيف فقط خصائص إضافية إلى نهاية الأمر مفصولة بفقرة مع فواصل ، كما هو موضح أدناه:
String HQL = "من الموظف e حيث E.ID> 10" + "ترتيب بواسطة e.firstname desc ، e.salary desc"
مجموعة بواسطة جملة
يتيح هذا البند استخراج المعلومات من قاعدة البيانات ومجموعة القيم القائمة على سمات السبات ، وعادة ما تستخدم النتيجة لتضمين القيمة الإجمالية. فيما يلي بناء جملة بسيطة باستخدام المجموعة بواسطة البند:
String HQL = "SELECT SUM (E.Salary) ، E.FirtName من الموظف E" + "Group by E.FirstName" ؛ Query Query = Session.Createquery (HQL) ؛ List Results = Query.List () ؛
استخدم المعلمات المسماة
يتم دعم Hibernate في معلمات استعلام HQL. هذا يجعل من السهل الكتابة وقبول المدخلات من المستخدمين دون الحاجة إلى الدفاع مقابل استعلامات HQL في هجمات حقن SQL. فيما يلي بناء جملة بسيط باستخدام المعلمات المسماة:
String HQL = "من الموظف e where e.id =: efferene_id" ؛ Query Query = Session.Createquery (HQL) ؛ Query.SetParameter ("exepmithee_id" ، 10) ؛ قائمة النتائج = query.list () ؛ تحديث جملة
تحديثات الدُفعات هي HQL جديدة مع Hibernate3 ، وأعمال الحذف المختلفة ، مثل Hibernate 3 و Hibernate2. تحتوي واجهة الاستعلام الآن على طريقة تسمى ExecuteUpDate () لتنفيذ تحديث HQL أو حذف البيان.
يمكن استخدام جملة التحديث لتحديث خصائص أو أكثر في كائن واحد أو أكثر. فيما يلي بناء جملة بسيط باستخدام جملة التحديث:
String HQL = "تحديث Set Office Set Salary =: Salary" + "where id =: efferene_id" ؛ Query Query = Session.Createquery (hql) ؛ query.setParameter ("Salary" ، 1000) ؛ Query.SetParameter ("exepmity_id" ، 10) ؛ حذف الجملة
يمكن استخدام شرط الحذف لحذف كائن واحد أو أكثر. فيما يلي بناء جملة بسيط باستخدام جملة الحذف:
السلسلة hql = "delete from ameister" + "where id =: experiese_id" ؛ query query = session.createquery (hql) ؛ Query.SetParameter ("exepmiteee_id" ، 10) ؛ int result = query.executeupdate () ؛ system.Ut.println ("rows regust: أدخل جملة
يدعم HQL الإدراج في بنود حيث يمكن إدراج السجلات فقط من كائن إلى آخر. فيما يلي بناء جملة بسيط باستخدام الإدراج في جملة:
String hql = "insert in effecte (firstName ، lastName ، salary)" + "select firstName ، lastName ، salary from Old_employee" ؛ Query Query = Session.Createquery (HQL) ؛ int result = query.executeupdate () ؛ system.out.println (
طريقة التجميع
يدعم HQL طرق تجميع متعددة ، على غرار SQL. إنهم يعملون في HQL بنفس الطريقة في SQL والقائمة التالية من الميزات المتاحة:
الكلمة الرئيسية المتميزة تحسب فقط القيم الفريدة المحددة على هذا الخط. سيعود الاستعلام التالي فقط عدد فريد من نوعه:
String HQL = "SELECT COUNT (DISTER E.FirstName) من الموظف E" ؛ استعلام Query = Session.Createquery (HQL) ؛ قائمة النتائج = Query.List () ؛
باستخدام ترقيم الاستعلام
هناك طريقتان لواجهات استعلام الصفحات.
معا ، يمكنك إنشاء مكون ترحيل على موقع ويب أو تطبيق تأرجح. فيما يلي مثال ، يمكنك تمديده للحصول على 10 أسطر:
String HQL = "من الموظف" ؛ استعلام Query = Session.Createquery (HQL) ؛ Query.SetFirStresult (1) ؛ Query.SetMaxResults (10) ؛ قائمة النتائج = Query.List () ؛
معايير الاستعلام
يوفر Hibernate طريقة بديلة لتشغيل الكائنات والبيانات المتاحة بالتتابع في جدول RDBMS. إحدى الطرق هي واجهة برمجة التطبيقات القياسية ، والتي تتيح لك إنشاء برمجة كائنات استعلام قياسية يمكنها تطبيق قواعد التصفية والشروط المنطقية.
توفر واجهة جلسة Hibernate مثيلًا لفئة يمكن استخدامها لإنشاء كائن مستمر يتم إرجاعه ، ويقوم التطبيق بتنفيذ استعلام مشروط لطريقة CreateCriteria ().
فيما يلي مثال على أبسط استعلام مشروط من شأنه أن يعيد ببساطة كل كائن يتوافق مع فئة الموظف.
معايير cr = session.createCriteria (efferene.class) ؛ قائمة النتائج = cr.list () ؛
القيود والمعايير:
يمكنك استخدام طريقة add () لإضافة استعلام التقييد باستخدام كائن المعايير. فيما يلي مثال على إضافة حد مع سجل إرجاع الراتب يساوي 2000:
معايير cr = session.createcriteria (efferene.class) ؛ cr.add (القيود
فيما يلي بعض الأمثلة التي تغطي سيناريوهات مختلفة ويمكن استخدامها كما هو مطلوب:
المعايير cr = session.createCriteria (emecister.class) ؛ // للحصول على سجلات لها راتب أكثر من 2000cr.add (القيود zaracr.add (القيود nullcr.add (القيود. فارغة. ad (القيود. يمكنك إنشاء و / أو ors لاستخدام logicalexpression لتقييد الشروط التالية: المعايير cr = session.createCriteria (efferene.class) ؛ STIRERION SALARY = القيود. اسم المعيار = القيود. Cr.List () ؛
على الرغم من أنه يمكن تقديم جميع الشروط المذكورة أعلاه مباشرة باستخدام HQL في البرنامج التعليمي السابق.
معايير استخدام الترحيل:
هناك أيضا واجهات قياسية ، وطريقتان للترقيم.
جنبا إلى جنب مع طريقتين أعلاه ، يمكننا بناء مكون ترحيل على موقعنا أو تطبيق التأرجح. فيما يلي مثال ، يمكن تمديده للحصول على 10 صفوف في وقت واحد:
المعايير cr = session.createcriteria (الموظف.
نتائج الفرز:
توفر واجهة برمجة التطبيقات القياسية org.hibernate.criterion.order فئة فرز النتيجة الخاصة بك في ترتيب تصاعدي أو تنازلي ، وفقًا لخصائص الكائن. يوضح هذا المثال كيفية الفرز باستخدام مجموعة النتائج من فئة الطلب:
المعايير cr = session.createcriteria (efferene.class) ؛ // للحصول على سجلات لها مبيعات أكثر من 2000cr.add (resrictions.gt ("الراتب" ، 2000)) ؛ التنبؤ والتجميع:
يوفر API المعايير org.hibernate.criterion.prouctions الفئة التي يمكن استخدامها للحصول على قيم السمة المتوسطة أو الحد الأقصى أو الحد الأدنى. تشبه فئة الإسقاطات الحد من الفئة لأنه يوفر العديد من أساليب المصنع الثابت للحصول على مثيلات الإسقاط. يوفر
فيما يلي بعض الأمثلة التي تتضمن مخططات مختلفة يمكن استخدامها على النحو المنصوص عليها:
المعايير cr = session.createcriteria (efferene.class) ؛ // للحصول على إجمالي عدد الصفوف. property.cr.setprojection (DespsideS.Max ("Salary")) ؛ // للحصول على الحد الأدنى من property.cr.setprojection (Profinleds.min ("الراتب")) ؛ // للحصول على مجموع property.cr.setprojection (Profelss.sum ("الراتب")) ؛ مثال على استفسارات المعايير:
النظر في فئة Pojo التالية:
موظف الطبقة العامة {private int id ؛ سلسلة خاصة firstName ؛ سلسلة خاصة راتب الباحث الخاص ؛ الموظف العام () {} الموظف العام (سلسلة fname ، سلسلة lname ، int راتب) {this.firstName = fname ؛ this.lastname = lname ؛ هذا. } public int getId () {return id ؛ } public void setId (int id) {this.id = id ؛ } السلسلة العامة getFirstName () {return firstName ؛ } public void setFirstName (string first_name) {this.firstName = first_name ؛ } السلسلة العامة getLastName () {return lastName ؛ } public void setLastName (String last_name) {this.lastname = last_name ؛ } public int getSalary () {return salary ؛ } public void setSalary (int salary) {this.salary = salary ؛ }}دعنا ننشئ جدول الموظف التالي لتخزين كائن الموظف:
قم بإنشاء موظف الجدول (ID int not null auto_increment ، first_name varchar (20) الافتراضي ، last_name varchar (20) الافتراضي ، الراتب الافتراضي الفارغ ، المفتاح الأساسي (المعرف)) ؛
سيتم تعيين الملفات التالية.
<؟ Table = "Employee"> <meta attribute = "class-description"> تحتوي هذه الفئة على تفاصيل الموظف. </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <property name = "firstName" column = "first_name" type = "string"/> <property name = "lastName" = "last_name" type = "string"/> <propert
أخيرًا ، سنقوم بإنشاء الطريقة الرئيسية () لفئة التطبيق لتشغيلها ، وسنستخدم استعلام المعايير للتطبيق:
استيراد 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 public static void main (string [] args) {try {factory = new configuration (). configure (). BuildSessionFactory () ؛ } catch (throwable ex) {system.err.println ("فشل في إنشاء كائن SessionFactory." + ex) ؛ رمي استثناء جديد initializererror (ex) ؛ } managementemive me = new ManagementEmployee () ؛ / * إضافة عدد قليل من سجلات الموظفين في قاعدة البيانات */ integer empid1 = me.addemplyee ("Zara" ، "ali" ، 2000) ؛ integer Empid2 = me.addemplyee ("daisy" ، "das" ، 5000) ؛ integer empid3 = me.addemplyee ("John" ، "Paul" ، 5000) ؛ integer empid4 = me.addemplyee ("mohd" ، "yasee" ، 3000) ؛ / * اذكر جميع الموظفين */ me.listemplyee () ؛ / * طباعة إجمالي عدد الموظف */ me.countemployee () ؛ / * طباعة راتب toatl */ me.totalsalary () ؛ } / * طريقة لإنشاء موظف في قاعدة البيانات * / public integer addemployee (سلسلة fname ، سلسلة lname ، int راتب) {جلسة الجلسة = factory.opensession () ؛ المعاملة tx = فارغة ؛ عدد صحيح الموظف = فارغ ؛ حاول {tx = session.begintransaction () ؛ الموظف الموظف = موظف جديد (fname ، lname ، الراتب) ؛ effereneiD = (عدد صحيح) الجلسة. save (موظف) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ } إرجاع الموظف ؛ } / * طريقة لقراءة جميع الموظفين الذين لديهم راتب أكثر من 2000 * / public void listemployees () {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ معايير cr = session.createcriteria (الموظف. class) ؛ // إضافة تقييد. Cr.Add (Resrictions.gt ("Salary" ، 2000)) ؛ قائمة الموظفين = cr.list () ؛ لـ (iterator iterator = amploy.iterator () ؛ iterator.hasnext () ؛) {efferene efference = (ameptory) iterator.next () ؛ system.out.print ("الاسم الأول:" + efferene.getFirstName ()) ؛ system.out.print ("الاسم الأخير:" + efferene.getLastName ()) ؛ System.out.println ("Salary:" + efferene.getSalary ()) ؛ } tx.commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة لطباعة إجمالي عدد السجلات * / countemploye public countemplication () {Session Session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ معايير cr = session.createcriteria (الموظف. class) ؛ // للحصول على إجمالي عدد الصفوف. Cr.SetProjection (Despsides.RowCount ()) ؛ قائمة rowcount = cr.list () ؛ System.out.println ("Total Coint:" + RowCount.get (0)) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }} / * طريقة لطباعة مجموع الرواتب * / public void totalsalary () {session session = factory.opensession () ؛ المعاملة tx = فارغة ؛ حاول {tx = session.begintransaction () ؛ معايير cr = session.createcriteria (الموظف. class) ؛ // للحصول على راتب إجمالي. Cr.SetProjection (DespplipeS.Sum ("Salary")) ؛ قائمة TotalSalary = cr.list () ؛ System.out.println ("إجمالي الراتب:" + totalsalary.get (0)) ؛ tx.Commit () ؛ } catch (hibernateException e) {if (tx! = null) tx.rollback () ؛ E.PrintStackTrace () ؛ } أخيرًا {session.close () ؛ }}} تجميع وتنفيذ:
فيما يلي الخطوات لتجميع وتشغيل التطبيق أعلاه. يرجى التأكد من تعيين المسار و classpath بشكل مناسب قبل التجميع والتنفيذ.
سيتم الحصول على النتائج التالية وسيتم إنشاء السجل في جدول الموظف.
$ Java ManagementEmployee
..... ستعرض رسائل سجل مختلفة هنا ......... الاسم الأول: Daisy الاسم الأخير: Das Salary: 5000First الاسم: John الاسم الأخير: Paul Paul: 5000First الاسم: Mohd الاسم الأخير: Yasee الراتب: 3000Total Coint: 4Total الراتب: 15000
إذا قمت بفحص جدول الموظف ، فيجب تسجيله على النحو التالي:
MySQL> حدد * من الموظف ؛
+---------------------------------+| معرف | first_name | last_name | مرتب |+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------