هناك بناء جملة استعلام HQL في السبات. ولكن ما نحن على دراية به هو حساب بيانات SQL. فكيف يجب أن نجعل دعم السبات SQL؟ لسنا بحاجة إلى النظر في هذا ، فقد قام فريق السبات بذلك بالفعل.
دعونا لا نتحدث هراء ، فقط تأخذ مثالا.
حدد * من T_USER usr
ما سبق هو بيان SQL ، وهو هراء ، وهو ما يعرفه الجميع. ماذا يجب أن نفعل إذا أراد السبات تنفيذ هذا البيان؟ انظر إلى الكود:
Query Query = session.createsqlquery ("SELECT * from t_user usr") ؛ هذا كل شيء ، يجب أن يعرف الجميع ما تبقى ، وما الذي يحدث في الاستفسارات طبيعية.
ثم ما الذي تم إرجاعه بعد الاستعلام؟
بينما (iter.hasnext ()) {object [] objs = (object []) iter.next () ؛ لـ (int i = 0 ؛ i <objs.length ؛ i ++) {system.out.print (objs [i]) ؛ } system.out.println () ؛ } كل نتيجة يتم إرجاعها هي كائن [].
في هذا الوقت ، خرج شخص ما وقال إنه موجه نحو الكائن. نعم ، إنه موجه نحو الكائن ، للأسف ، لا توجد طريقة.
دعنا نستمر في المشاهدة:
حدد {usr.*} من t_user usr رؤية هذا ، أعتقد أن بعض أحذية الأطفال بدأت في التحرك. ما هي الأقواس؟
لا تقلق ، خذ وقتك. دعنا نستمر في قراءة الكود أولاً.
نسخة الكود كما يلي:
Query Query = session.createsqlquery ("SELECT {usr.*} من t_user usr"). الإضافة (tuser.class) ؛
AddentitySqlquery Addentity (خيط ورقصة ، entitytype) يعلن "الجذر" entityparameters: ملفقة ورقصة - جدول SQL الاسم المستعار - نوع java من الكيان لإضافته كجذر
إنه نفسه كما هو ، إنه مص طفيف. يمكنك فقط استخدامه بنفسك.
تشير المعلمة الأولى إلى الاسم المستعار في الجدول. تمامًا مثل البيان أعلاه ، فإن الاسم المستعار لجدولنا هو USR ، وبالتالي فإن المعلمة الأولى هي USR ، والثاني يشير إلى الفئة التي تحتاج إلى تعيين نتائج الاستعلام إليها. هنا ، نظرًا لأننا نقوم بتخطيط جدول T_USER من خلال Tuser في ملف التعيين ، فنحن بالطبع Tuser هنا. ثم بعد التحقق ، هناك عبارات SQL ، والنتيجة هي نوع tuser.
النتائج التي وجدناها هي:
org.hibernate.tutorial.domain6.tuser@198cb3d
بالطبع ، يجب أن تكون لك مختلفة عن لي. لا تحرك الدجاج.
ربما لا نحتاج إلى معرفة كل شيء ، في هذا الوقت ، كل ما نحتاجه هو تعيين الاسم المستعار:
حدد U.ID كـ {usr.id} ، اسم U.NAME كـ {usr.name} ، U. نرى أننا استخدمنا في تحديد الاسم المستعار للحقل ، والشيء نفسه صحيح في البرنامج:
نسخة الكود كما يلي:
استعلام Query = session.createsqlquery ("حدد U.ID كـ {usr.id} ، U.Name as {usr.name} ، U.
<sql-query name = "querytuser"> <return alias = "usr" entity-name = "org.hibernate.tutorial.domain6.tuser" /> select {usr. لاحظ أنه يجب كتابة اسم الكيان هنا باستخدام اسم الحزمة الكامل ، وإلا سيتم الإبلاغ عن خطأ. هنا لدينا عودة الترجمة ، والتي تحدد الاسم المستعار واسم الفئة للجدول ، بحيث لا نحتاج إلى الإضافة في وقت التشغيل.
انظر إلى الكود:
Query Query = Session.getNamedQuery ("QueryTuser") ؛ Query.SetParameter ("name" ، "Shun") ؛ قائمة قائمة = Query.List () ؛ iterator iter = list.iterator () ؛
نحن بخير مثل هذا. لاحظ أننا لم نضيف الإضافة ، ويرجع ذلك أساسًا إلى التكوين في ملف التكوين.
لاحظ أنه إذا تم تكوينه في ملف التكوين ، فيجب أن يكون لديك Subtag الإرجاع لتحديد اسم الاسم المستعار للجدول واسم الفئة. هذا يتجنب بشكل أساسي الأحكام المتكررة عند قراءة البيانات.
بعد الحديث عنها لفترة طويلة ، كنا نتحدث عن الطاولات التي تحتوي على الاسم المستعار. إذن ما الذي يجب أن نفعله إذا لم يكن لجدولنا اسم مستعار لكننا نريد تغليف النتيجة في الكائن؟
حدد * من T_USER usr
الأمر بسيط للغاية. ما عليك سوى استدعاء Addentity Method Method Addentity (Class Clazz) وتحتاج فقط إلى توفير اسم فئة ، بدون اسم الاسم المستعار للجدول.
بالطبع ، يدعم السبات أيضًا الإجراءات المخزنة. تحتاج فقط إلى تعيين خاصية قابلة للاستدعاء لـ SQL-QUERY إلى TRUE في ملف التكوين للإشارة إلى أن الإجراءات المخزنة التي تسمى حاليًا. نظرًا لأنني لا أمتلك الكثير من الاتصالات مع الإجراءات المخزنة ، سأدرسها أكثر في المستقبل ثم أدرسها معك.
عندما نسمي الطرق المقابلة لعمليات البيانات مثل Session.save ، سيتم تحويلها إلى بيان SQL المدمج في Hibernate ، ولكن ماذا لو أردنا التحكم في تنسيق بيان SQL لأنفسنا؟
السبات في الواقع فكرت في الأمر أيضا.
نضيفه مباشرة إلى ملف التعيين:
<sql-insert> إدراج في T_USER (الاسم ، العمر) قيم (؟ ،؟) </sql-insert> <SQL-UPDATE> تحديث مجموعة المستخدم user_name =؟ ، العمر =؟ أين user_id =؟ </sql-update>
لاحظ أن هذا يجب إضافته في علامة الفصل كرجوع فرعي. نحن جميعا رسائل رأس المال هنا ، لتمييزها عن البيانات الافتراضية لإسبات ، وليس لدينا أي معنى آخر.
دعنا نلقي نظرة أولاً على المكالمة لإدراج:
مستخدم المستخدم = مستخدم جديد () ؛ user.setName ("shun123123") ؛ user.setage (23) ؛ عندما نسمي الحفظ ، فإن بيان السبات هو:
السبات:
أدخل في قيم المستخدم (user_name ، العمر) (؟ ،؟)
يستدعي البيانات الواردة في علامة SQL-Insert التي قمنا بتكوينها ، دعنا نلقي نظرة على المكالمة للتحديث:
مستخدم المستخدم = (المستخدم) Session.get (user.class ، New Long (29)) ؛ user.setName ("shun123123") ؛ user.setage (23) ؛ Session.save (user) ؛ ندعو الحفظ ، وسوف يتصل تلقائيًا بالتحديث ، والبيان في هذا الوقت هو:
السبات:
تحديث المستخدم تعيين user_name =؟ ، العمر =؟ أين user_id =؟نرى أن بيان الإخراج يتم رسملة ، مما يعني أن البيان الذي قمنا بتكوينه يسمى.