دعنا نتحدث عن استعلام المعايير ، وهو أمر سهل بالنسبة لنا المبرمجين الذين ليسوا على دراية ببيانات SQL.
بدون مزيد من اللغط ، دعونا نلقي نظرة على المثال:
فئة الكيان على النحو التالي:
مستخدم الفئة العامة ينفذ مسلسل {private static final long serialversionuid = 1L ؛ معرف طويل عام ؛ اسم السلسلة الخاصة ؛ عصر INT الخاص ؛ // حذف GET/SET METLEST} لن نكتب ملف التعيين ، إنه كيان بسيط للغاية. إذا كنت لا تفهم أحذية الأطفال ، فيرجى الرجوع إلى مقالاتي الأخرى في فئة السبات.
بعد ذلك ، دعونا نرى كيفية استخدام معايير الاستعلام:
public static void main (string [] args) {configuration cfg = new configuration (). configure () ؛ SessionFactory SessionFactory = cfg.buildSessionFactory () ؛ جلسة الجلسة = sessionfactory.opensession () ؛ معايير المعايير = session.createcriteria (user.class) ؛ المعايير. قائمة قائمة = معايير. list () ؛ iterator iter = list.iterator () ؛ بينما (iter.hasnext ()) {user user = (user) iter.next () ؛ System.out.println (user.getName ()+":"+user.getage ()) ؛ } session.close () ؛ } رؤية الكود ، إنها سلسلة بسيطة للغاية.
نحن جميعًا على دراية بالأشكال السابقة ، ونرى الرمز بعد بناء الجلسة:
معايير المعايير = session.createcriteria (user.class) ؛ المعايير.
هاتان الجملتان من الكود هما النقاط الرئيسية. دعونا نحلل ماذا يعني بالضبط؟
في الجملة الأولى ، نحصل على كائن من فئة تنفيذ المعايير من خلال الجلسة ، وفي الجملة الثانية ، نضيف شرطًا من خلال طريقة إضافة ، ويمثل EQ المساواة. تم تنفيذ Hibernate3 سابقًا من خلال Expression.eq. بعد 3 ، منذ التخلي عن المعايير ، استخدمنا فئة القيود لتنفيذها ، وهو نفس التعبير. دعونا نلقي نظرة على واجهة برمجة التطبيقات ونجد أن التعبير يرث من القيود.
بالعودة إلى جملتنا أعلاه ، بعد أن انتهينا من هذه المهام ، ساعدنا السبات بالفعل في بناء مماثل
حدد * من المستخدم حيث name = 'shun'
مثل هذا البيان. (هنا ، الجدول المقابل لفئة المستخدم في ملف التعيين الخاص بنا هو جدول المستخدم ، ويتوافق سمة الاسم مع حقل الاسم)
تحتوي القيود أيضًا على العديد من الطرق لمساعدتنا على بناء عبارات SQL. من السهل الفهم بعد التحقق من واجهة برمجة التطبيقات.
دعونا نعيد الرؤية في الكود أعلاه. إذا أغلقنا الجلسة ، لكننا نريد مواصلة استخدام هذه المعايير ، هل هذا جيد؟ دعونا نلقي نظرة.
بعد الكود أعلاه ، نعيد التغلب على: إضافة:
LIST 2 = NATERIA.LIST () ؛ iterator iter2 = list.iterator () ؛ بينما (iter.hasnext ()) {user user = (user) iter.next () ؛ System.out.println (user.getName ()+":"+user.getage ()) ؛ } من أجل التمييز بين الفرق بين القائمة السابقة و iter ، نستخدم آخر هنا.
قم بتشغيله ونحصل على استثناء:
org.hibernate.SessionException: الجلسة مغلقة!
الإبلاغ عن هذا الاستثناء يعني أنه تم إغلاق الجلسة. في كثير من الحالات ، سنقوم بالإبلاغ عن استثناءات مماثلة بعد إغلاق الجلسة ثم إجراء العمليات المتعلقة بـ SaveorupDate ، Save ، إلخ.
يأخذ Hibernate3 في الاعتبار احتياجاتنا وينفذ معايير الانفصال ، والتي يمكن أن توجد بشكل مستقل عن الجلسة.
دعونا نلقي نظرة على المثال: (الكيان لا يزال أعلاه)
public static void main (string [] args) {configuration cfg = new configuration (). configure () ؛ SessionFactory SessionFactory = cfg.buildSessionFactory () ؛ جلسة الجلسة = sessionfactory.opensession () ؛ تناقض الانفصال = detachedcrinitiara.forclass (user.class) ؛ despliteria.Add (القيود. قائمة قائمة = desultieria.getExecutableCriteria (Session) .List () ؛ iterator iter = list.iterator () ؛ بينما (iter.hasnext ()) {user user = (user) iter.next () ؛ System.out.println (user.getName ()+":"+user.getage ()) ؛ } session.close () ؛ الجلسة 2 = sessionfactory.opensession () ؛ list 2 = displisteria.getExecutableCriteria (Session2) .List () ؛ iterator iter2 = list2.iterator () ؛ بينما (iter2.hasnext ()) {user user = (user) iter2.next () ؛ System.out.println (user.getName ()+":"+user.getage ()) ؛ }} نرى أنه بعد إغلاق الجلسة ، يمكننا الاستمرار في استخدام الانفصال في اتصال آخر. نحتاج إلى ربط الانفصال الحالي بجلسة معينة من خلال GetExecutablecriteria (جلسة الجلسة).
بعد ذلك ، دعونا نلقي نظرة على مزيج من فئة الفتات الفرعية والفصل:
public static void main (string [] args) {configuration cfg = new configuration (). configure () ؛ SessionFactory SessionFactory = cfg.buildSessionFactory () ؛ جلسة الجلسة = sessionfactory.opensession () ؛ تناقض الانفصال = detachedcrinitiara.forclass (user.class) ؛ desclisteria.setProjection (DespsideS.Avg ("Age")) ؛ معايير المعايير = session.createcriteria (user.class) ؛ المعايير. قائمة قائمة = معايير. list () ؛ iterator iter = list.iterator () ؛ بينما (iter.hasnext ()) {user user = (user) iter.next () ؛ System.out.println (user.getName ()+":"+user.getage ()) ؛ } session.close () ؛ } أعتقد أن جملة الكود الأولى لديك أسئلة:
desclisteria.setProjection (DespsideS.Avg ("Age")) ؛ يشير هذا الرمز إلى الحصول على متوسط قيمة العمر من خلال التماثل. ثم احصل على الكائن مع عمر أكبر من متوسط القيمة أدناه.
تحتوي التوقعات على العديد من طرق التغليف التي تنفذ أساليب SQL. يمكنك إلقاء نظرة على واجهة برمجة التطبيقات.
دعنا نتعرف على استخدامه أكثر تقدماً قليلاً.
فقط انظر إلى الكود:
معايير. معايير.
هنا قمنا بتعيين سجل البداية على أنه المادة 10 ، ثم نجد 20 سجلًا من المادة 10. وفقًا لهذه الممارسة ، يمكننا تنفيذ وظيفة الترحيل الأساسية.
بالطبع ، نحتاج إلى الفرز في كثير من الحالات ، كما تدعمه المعايير:
المعايير.
هنا ، يمكننا استخدام طريقة Addorder مباشرة ، والحصول على كائن طلب من خلال Order.desc ، والذي يتطلب معلمة سمة. في الواقع ، عندما ندعو Addorder ، سوف يساعدنا السبات في إنشاء أمر حسب العمر ، مثل هذا البيان.
كيف نفعل هذا عندما نحتاج إلى تجميعه؟ هذا يتطلب طريقة groupproperty لفئة التوقعات التي ذكرناها في المرة الأخيرة.
معايير.
هنا نقوم بتجميعها وفقًا لسمة العمر ، والتي يتم تجميعها بالفعل من خلال عصر الحقل المقابل للعمر. ستقوم Hibernate بتحويله تلقائيًا إلى بيان مثل Group حسب العمر.
هناك العديد من الأساليب العملية في الإسقاطات (لاحظ أن هذا متاح فقط بعد السبات 3).