يدعم JPA طريقتين للتعبير عن الاستفسارات لاسترداد الكيانات والبيانات المستمرة الأخرى من قاعدة البيانات: بيانات الاستعلام (لغة الاستعلام في جافا ، JPQL) ومعايير API (معايير API). JPQL عبارة عن عبارة استعلام مستقلة عن قاعدة البيانات يتم استخدامها لتشغيل نماذج الكيانات المنطقية بدلاً من نماذج البيانات الفعلية. API الشرطي هو بناء ظروف الاستعلام بناءً على نموذج الكيان
1. البدء في بيانات الاستعلام المستمرة Java
نسخة التعليمات البرمجية كما يلي: قائمة <Person> PERSONS = entityManager.Createquery ("SELECT P From Person P"). getResultList () ؛
1. بيان الاستعلام هذا يشبه SQL. لكن الفرق بينه وبين SQL Real هو أنه بدلاً من إجراء استعلام تحديد من جدول ، فإنه يحدد الكيان من نموذج مجال التطبيق.
2. شرط SELECT SELECT يسرد فقط الاسم المستعار لكيان الاستعلام. إذا قمت بالاستعلام عن عمود معين فقط ، فيمكنك استخدام مشغل DOT (.) للتنقل في خصائص الكيان. كما هو موضح أدناه:
نسخة التعليمات البرمجية كما يلي: قائمة <Tring> persons = entityManager.Createquery ("SELECT P.FirstName from Person P"). getResultList () ؛
1.1. معايير التصفية
مثل SQL ، يدعم JPQL أيضًا مكان الجمل ، والتي تستخدم لتصفية معايير البحث. يتضمن معظم المشغلين ، مثل: في ، بين ، مثل ، فرعية التعبير الوظيفي ، الطول ، إلخ.
نسخة التعليمات البرمجية كما يلي: قائمة <Person> PERSONS = entityManager.CREATEQUERY ("SELECT P From Person p Where P.AGE> 23"). GetResultList () ؛
1.2. نتائج الإسقاط
إذا كانت كمية البيانات التي تم الاستعلام عنها كبيرة نسبيًا ، فيمكنك استخدام الإسقاط للاستعلام عن الأعمدة المفيدة فقط.
نسخة التعليمات البرمجية هي كما يلي:/قائمة المشروع <Object> persons = entityManager.Createquery ("Select P.FirstName ، P.Age from Person P"). getResultList () ؛
1.3. استعلام التجميع
يشبه بناء جملة الاستعلام الإجمالي لـ JPQL SQL. على سبيل المثال العد
نسخة الكود كما يلي: قائمة <integer> count = entityManager.Createquery ("حدد العد (ع) من الشخص P"). getResultList () ؛
1.4. معلمات الاستعلام
يدعم JPQL نوعين من بناء جملة ربط المعلمة.
1. تمثيل معلمة الموضع
حيث يتم الإشارة إلى المعلمة في سلسلة الاستعلام ، وهو الرقم الذي يتبع المعلمة فورًا بعد علامة استفهام (؟). عند تنفيذ استعلام ، يحدد المطور المعلمات التي يجب استبدالها
استعلام Query = entityManager.Createquery ("SELECT P From Person p Where P.AGE =؟ 1 و P.FirstName =؟ 2") ؛ Query.SetParameter (1،21) ؛ Query.setParameter (2 ، "Jack") ؛ 2. تدوين المعلمة المسماة
باتباع القولون (:) والإشارة إليه في سلسلة الاستعلام ، يحدد المطور اسم المعلمة الذي يجب استبداله عند تنفيذ الاستعلام
استعلام Query = entityManager.Createquery ("Select P from person p where p.age =: age and p.firstName =: name") ؛ Query.SetParameter ("Age" ، 21) ؛ Query.SetParameter ("name" ، "Jack") ؛2. حدد الاستعلام
يوفر JPA واجهات الاستعلام والطباعة (التي تم تقديمها بواسطة JPA 2.0) لتكوين وتنفيذ الاستعلامات. يقوم الاستعلام بإرجاع نوع الكائن ، بينما يقوم TypedQuery بإرجاع نوع الفئة المحدد.
// لم يتم تحديد نوع النوع ، استعلام نوع الكائن Q = entityManager.Createquery ("حدد P من الشخص P") ؛ // حدد نوع الإرجاع كنوع الشخص typedquery <profire> Q1 = entityManager.Createquery ("SELECT P from person p" ، person.class) ؛2.1. تعريف الاستعلام الديناميكي
يمكن لمحرك الاستعلام JPA تحليل سلاسل JPQL في أشجار بناء الجملة ، والحصول على بيانات التعريف من خرائط الكائنات الكيميائية في التعبيرات ، ثم إنشاء SQL مكافئ. لذلك ، هناك طريقتان لإجراء استعلام ديناميكي.
1. طريقة سلسلة SPLIT
نصيحة: سوف تسبب مشاكل حقن SQL
/** * شروط استعلام بناء سلسلة الربط الديناميكي * * param الاسم * param age * @RETURN */public Static String QueryPersonJPQL (اسم السلسلة ، int age) {String queryql = "Select p from prof pherstname = ' + name +"' and p.age = " + age ؛ return queryql ؛} // call Query Query = entityManager.Createquery (QueryPersonJpql ("Jack" ، 21)) ؛ 2. البناء المعلمات الديناميكي لظروف الاستعلام (موصى به)
/** * شروط استعلام البناء المعلمة الديناميكية * * regurn */public static String QueryPersonJpqlByParams () {String QueryQl = "Select p from pers p p.firstName =: name and p.age =: age" ؛ return queryql ؛} Query Query = entityManager.Createquery (QueryPersonJpqlByparams ()) ؛ Query.SetParameter ("name" ، "Jack") ؛ Query.setParameter ("Age" ، 21) ؛2.2. تعريف الاستعلام المسماة
الاستعلام المسماة هو أداة قوية. استخدم التعليق التوضيحي لـ namedquery لتحديد استعلام مسمى يمكن وضعه فوق تعريف فئة أي كيان. يحدد هذا الشروح اسم الاستعلام ونصه.
نصيحة: يتم وضع الاستعلام المسماة على فئة الكيان المقابلة لنتيجة الاستعلام
@entity@namequery (name = "findByage" ، Query = "SELECT P from pers p where p.age =: age)
الاسم المحدد في TIP: يجب أن يكون اسمه المسماة فريدًا في وحدة الثبات بأكملها ، وإلا سيكون هناك خطأ في العملية.
على سبيل المثال:
نسخة الكود كما يلي:
استثناء في الموضوع "الرئيسي" org.hibernate.duplicateMappingException: Mapping Query Mapping FindByage في org.hibernate.boot.internal.inflightmetadataCollectorimpl.CheckqueryName
يتصل
نسخة الكود كما يلي:
قائمة <Phone> people = entityManager.createNamedQuery ("findByage" ، person.class) .SetParameter ("Age" ، 21) .GetResultList () ؛
إذا حدد فئة اثنين أو أكثر من الاستعلامات المسماة ، فيجب وضعه في NamedQueries ()
2.3. ربط المعلمات
من خلال المثال السابق ، يمكننا أن نرى أن هناك طريقتان لربط المعلمات: 1. ربط المعلمات الموضع. 2. الاسم المعلمة الربط. جميعها ملزمة من خلال طريقة setParameter لواجهة الاستعلام.
1. المعلمة الموقف
typedquery <x> setParameter (موضع int ، قيمة الكائن) ؛
2. اسم المعلمة
typedquery <x> setParameter (اسم السلسلة ، قيمة الكائن) ؛
الأول هو الربط المعلمة الموضع. إذا تغير الموقف ، فيجب تغيير الكود المرتبط. ينصح النوع الثاني.
2.4. تنفيذ الاستعلام
توفر واجهة الاستعلام وواجهة TypedQuery ثلاث طرق مختلفة لإجراء استعلامات.
1.executeupdate
تستخدم لإجراء تحديثات الدُفعات أو الحذف
2.getsingleresult
احصل على مجموعة نتيجة واحدة. إذا لم يتم الحصول على أي بيانات ، فسيتم طرح noresultexception. إذا تم الحصول على أجزاء متعددة من البيانات ، فسيتم إلقاء مجموعة غير متوفرة
3.GetResultList
احصل على مجموعة النتائج المقابلة وحدد ترتيب المجموعة. يجب استخدام القائمة كنوع قيمة الإرجاع. إذا لم يتم الحصول على أي بيانات ، يتم إرجاع مجموعة فارغة ولا يتم إلقاء أي استثناء
2.5. ترقيم الصفحات
يمكن إكمال استعلام ترقيم الصفحات من خلال طرق setFirstresult () و setMaxResults ()
رقم صفحة الاستعلام هو 0 ، ويتم عرض قطعتين من البيانات في كل صفحة
نسخة الكود كما يلي:
قائمة <Pirnic> people = entityManager.createquery ("Select P from person P" ، person.class) .setFirStresult (0) .SetMaxResults (2) .getResultList () ؛
نصيحة: لا يمكن استخدامها للاستعلامات المتصلة بعلاقات التجميع ، لأن هذه الاستعلامات قد تُرجع القيم المكررة.
2.6. مهلة الاستعلام
إذا احتاج التطبيق إلى تعيين حد على وقت استجابة الاستعلام ، فيمكنك تعيين خاصية javax.persistence.query.timeout في الاستعلام (تم تقديمه بواسطة JPA 2.0) أو استخدامه كجزء من خاصية الثبات. تحدد هذه الخاصية عدد == milliseconds المسموح لها بالركض قبل إنهاء الاستعلام. إذا كانت مهلة الاستعلام ، فسيتم طرح QueryTimeOutException.
typedquery <profer> query = entityManager.createquery ("Select P from person P" ، person.class) ؛ // الوحدة هي milliseconds javax.persistence.query.timeoutquery.sethint ("javax.persistence.query.timeout" ، 5000)2.7. تحديثات الدُفعات والحذف
يتم الانتهاء من كيان تحديث الدُفعات من خلال بيان التحديث. يتم حذف الدُفعات من الكيانات من خلال حذف البيانات. كلاهما يحدد خصائص الكيان وفصله.
entityManager.getTransaction (). begin () ؛ Query Query = entityManager.Createquery ("تحديث الشخص p set p.firstName =: name where p.id = id") ؛ query.setparameter ("name" ، "xiaobai") ؛ Query.setParameter ("id" ، 2) entityManager.createquery ("حذف الشخص p حيث p.id =: id") ؛ query1.setParameter ("id" ، 9) ؛ query1.executeupdate () ؛ entityManager.getTransaction (). commice () ؛3. اقتراحات لاستخدام استعلام JPQL
في أنظمة التطبيق ، عادة ما يتم استخدام عدد الاستعلامات أكثر من إضافة وتعديل وحذف. لذلك ، من المهم بشكل خاص استخدام الاستعلام والعرض بشكل معقول.
1. من المستحسن استخدام الاستعلام المسماة (اسمه)
عادةً ما تستخدم البرامج المقدمة من الثبات طرقًا مسبقة لاستخدام الاستعلامات المسماة كجزء من مرحلة تهيئة البرنامج. هذا يتجنب نظام التحليل المستمر لـ JPQL وتوليد SQL.
2. استخدم الإسقاط لاسترداد عدد صغير من الأعمدة أولاً.
عادةً ما يقوم استعلام JPA بإرجاع جميع أعمدة الكيان بأكمله ، ولكن للحصول على كمية هائلة من البيانات ، لا يلزم استخدام جميع أعمدة الكيان. ثم يمكننا استخدام الإسقاط للتعامل معها.
قائمة <list <object [] >> persons = entityManager.createquery ("حدد قائمة جديدة (اسم FirstName) من الشخص P"). getResultList () ؛ for (object o: persons) {system.out.println (o) ؛} // نتيجة الإخراج [Jack ، 21] [Jack ، 21]ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.