ماهو JPA - JPQL في جي بي آي
ماهو JPA - JPQL في جي بي آي
ماهو JPA - JPQL في جي بي آي
يخبرك هذا الفصل حول JPQL وكيف يعمل مع وحدات الثبات. في هذا الفصل ، تتبع الأمثلة نفس التسلسل الهرمي للحزمة ، والذي استخدمناه في الفصل السابق على النحو التالي:
لغة جافا استعلام البرسيزتنس persistence المعروف بالاستمرار
JPQL هي لغة استعلام Java Persistence المحددة في مواصفات JPA. يتم استخدامه لإنشاء استعلامات مقابل كيانات لتخزينها في قاعدة بيانات علائقية. تم تطوير JPQL بناءً على بناء جملة SQL. لكنه يؤثر على قاعدة البيانات مباشرة.
يمكن لـ JPQL استرداد المعلومات أو البيانات باستخدام جملة SELECT ، ويمكن إجراء تحديثات مجمعة باستخدام جملة UPDATE وعبارة DELETE. واجهة برمجة تطبيقات EntityManager.createQuery () ستدعم لغة الاستعلام.
هيكل الاستعلام Query Structure
بناء جملة JPQL مشابه جدًا لبناء جملة SQL. يعد امتلاك SQL مثل بناء الجملة ميزة لأن SQL هي لغة استعلام منظمة بسيطة ويستخدمها الكثير من المطورين في التطبيقات. يعمل SQL مباشرة ضد جداول قاعدة البيانات العلائقية والسجلات والحقول ، بينما يعمل JPQL مع فئات Java ومثيلاتها.
على سبيل المثال ، يمكن لاستعلام JPQL استرداد كائن كيان بدلاً من تعيين نتيجة الحقل من قاعدة البيانات ، كما هو الحال مع SQL. بنية استعلام JPQL كما يلي.
SELECT ... FROM ... [WHERE ...] [GROUP BY ... [HAVING ...]] [ORDER BY ...]
بنية JPQL في DELETE واستعلامات UPDATE أبسط كما يلي.
DELETE FROM ... [WHERE ...] UPDATE ... SET ... [WHERE ...]
دوال العددية والجمع
ترجع الدالات العددية القيم الناتجة بناءً على قيم الإدخال. ترجع الدالات التجميعية القيم الناتجة عن طريق حساب قيم الإدخال.
اتبع نفس المثال إدارة الموظفين المستخدمة في الفصول السابقة. سننتقل هنا إلى فئات الخدمة باستخدام الدالات العددية والتجميعية لـ JPQL.
لنفترض أن جدول jpadb.employee يحتوي على السجلات التالية.
Eid | Ename | Salary | Deg |
---|---|---|---|
1201 | Gopal | 40000 | Technical Manager |
1202 | Manisha | 40000 | Proof Reader |
1203 | Masthanvali | 40000 | Technical Writer |
1204 | Satish | 30000 | Technical Writer |
1205 | Krishna | 30000 | Technical Writer |
1206 | Kiran | 35000 | Proof Reader |
قم بإنشاء فئة باسم ScalarandAggregateFunctions.java ضمن حزمة com.ahmedalmahallawi.eclipselink.service كما يلي.
package com.ahmedalmahallawi.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; public class ScalarandAggregateFunctions { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); //Scalar function Query query = entitymanager. createQuery("Select UPPER(e.ename) from Employee e"); List<String> list = query.getResultList(); for(String e:list) { System.out.println("Employee NAME :"+e); } //Aggregate function Query query1 = entitymanager.createQuery("Select MAX(e.salary) from Employee e"); Double result = (Double) query1.getSingleResult(); System.out.println("Max Employee Salary :" + result); } }
بعد تجميع وتنفيذ البرنامج أعلاه ، سوف تحصل على الإخراج في لوحة التحكم في Eclipse IDE على النحو التالي:
Employee NAME :GOPAL Employee NAME :MANISHA Employee NAME :MASTHANVALI Employee NAME :SATISH Employee NAME :KRISHNA Employee NAME :KIRAN ax Employee Salary :40000.0
Between بين ، And و ، Like مثل الكلمات المحجوزة او الرئيسية
الكلمات الرئيسية لـ JPQL هي "بين" و "و" و "مثل". يتم استخدام هذه الكلمات الأساسية بعد جملة أين في استعلام.
قم بإنشاء فصل دراسي اسمه BetweenAndLikeFunctions.java ضمن الحزمة com.ahmedalmahallawi.eclipselink.service كما يلي:
package com.ahmedalmahallawi.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import com.tutorialspoint.eclipselink.entity.Employee; public class BetweenAndLikeFunctions { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); //Between Query query = entitymanager.createQuery( "Select e " + "from Employee e " + "where e.salary " + "Between 30000 and 40000" ); List<Employee> list=(List<Employee>)query.getResultList( ); for( Employee e:list ){ System.out.print("Employee ID :" + e.getEid( )); System.out.println("\t Employee salary :" + e.getSalary( )); } //Like Query query1 = entitymanager.createQuery("Select e " + "from Employee e " + "where e.ename LIKE 'M%'"); List<Employee> list1=(List<Employee>)query1.getResultList( ); for( Employee e:list1 ) { System.out.print("Employee ID :"+e.getEid( )); System.out.println("\t Employee name :"+e.getEname( )); } } }
بعد تجميع وتنفيذ البرنامج أعلاه ، سوف تحصل على الإخراج في لوحة التحكم في Eclipse IDE على النحو التالي:
Employee ID :1201 Employee salary :40000.0 Employee ID :1202 Employee salary :40000.0 Employee ID :1203 Employee salary :40000.0 Employee ID :1204 Employee salary :30000.0 Employee ID :1205 Employee salary :30000.0 Employee ID :1206 Employee salary :35000.0 Employee ID :1202 Employee name :Manisha Employee ID :1203 Employee name :
الترتيب Ordering
لطلب السجلات في JPQL ، نستخدم جملة ORDER BY. استخدام هذه الفقرة هو نفس الاستخدام في SQL ، لكنه يتعامل مع الكيانات. اتبع الترتيب حسب المثال.
قم بإنشاء فصل Ordering.java ضمن الحزمة com.ahmedalmahallawi.eclipselink.service كما يلي:
package com.ahmedalmahallawi.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import com.tutorialspoint.eclipselink.entity.Employee; public class Ordering { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); //Between Query query = entitymanager.createQuery( "Select e " + "from Employee e " + "ORDER BY e.ename ASC" ); List<Employee> list = (List<Employee>)query.getResultList( ); for( Employee e:list ) { System.out.print("Employee ID :" + e.getEid( )); System.out.println("\t Employee Name :" + e.getEname( )); } } }
بعد تجميع وتنفيذ البرنامج أعلاه ، سوف تحصل على الإخراج في لوحة التحكم في Eclipse IDE على النحو التالي:
Employee ID :1201 Employee Name :Gopal Employee ID :1206 Employee Name :Kiran Employee ID :1205 Employee Name :Krishna Employee ID :1202 Employee Name :Manisha Employee ID :1203 Employee Name :Masthanvali Employee ID :1204 Employee Name
الاستعلامات المسماة
يتم تعريف التعليق التوضيحيNamedQuery كاستعلام مع سلسلة استعلام غير قابلة للتغيير معرفة مسبقًا. بدلاً من الاستعلامات الديناميكية ، قد يؤدي استخدام الاستعلامات المسماة إلى تحسين تنظيم التعليمات البرمجية عن طريق فصل سلاسل استعلام JPQL من POJO. كما أنه يناسب معلمات الاستعلام بدلاً من تضمين القيم الحرفية ديناميكيًا في سلسلة الاستعلام وينتج عنها استعلامات أكثر فاعلية.
بادئ ذي بدء ، أضف تعليقًا توضيحيًاNamedQuery إلى فئة كيان الموظف المسمى Employee.java ضمن حزمة com.ahmedalmahallawi.eclipselink.entity كما يلي :
package com.ahmedalmahallawi.eclipselink.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table @NamedQuery(query = "Select e from Employee e where e.eid = :id", name = "find employee by id") public class Employee { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int eid; private String ename; private double salary; private String deg; public Employee(int eid, String ename, double salary, String deg) { super( ); this.eid = eid; this.ename = ename; this.salary = salary; this.deg = deg; } public Employee( ) { super(); } public int getEid( ) { return eid; } public void setEid(int eid) { this.eid = eid; } public String getEname( ) { return ename; } public void setEname(String ename) { this.ename = ename; } public double getSalary( ) { return salary; } public void setSalary(double salary) { this.salary = salary; } public String getDeg( ) { return deg; } public void setDeg(String deg) { this.deg = deg; } @Override public String toString() { return "Employee [eid=" + eid + ", ename=" + ename + ", salary=" + salary + ", deg=" + deg + "]"; } }
قم بإنشاء فصل باسم NamedQueries.java ضمن com.ahmedalmahallawi.eclipselink.service package كما يلي:
package com.ahmedalmahallawi.eclipselink.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import com.tutorialspoint.eclipselink.entity.Employee; public class NamedQueries { public static void main( String[ ] args ) { EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" ); EntityManager entitymanager = emfactory.createEntityManager(); Query query = entitymanager.createNamedQuery("find employee by id"); query.setParameter("id", 1204); List<Employee> list = query.getResultList( ); for( Employee e:list ){ System.out.print("Employee ID :" + e.getEid( )); System.out.println("\t Employee Name :" + e.getEname( )); } } }
Employee ID :1204 Employee Name :Satish
بعد إضافة جميع الفئات المذكورة أعلاه ، يظهر التسلسل الهرمي للحزمة على النحو التالي:
التحميل البيانات او استرجاعها بواسطة الحريص Edgar او الكسول Lazy
المفهوم الرئيسي لـ JPA هو عمل نسخة مكررة من قاعدة البيانات في ذاكرة التخزين المؤقت. أثناء التعامل مع قاعدة البيانات ، أولاً سيؤثر ذلك على بيانات مكررة وفقط عندما يتم الالتزام به باستخدام مدير الكيان المفتاح الرئيسي primary key، يتم تنفيذ التغييرات في قاعدة البيانات.
هناك طريقتان لجلب السجلات من قاعدة البيانات - جلب حريص Edgar وجلب كسول Lazy.
الجبل بواسطة اديقار Edgar او الحريصة.
جلب السجل بأكمله أثناء العثور على السجل باستخدام المفتاح الأساسي.
جلب كسول Lazy
إنه يتحقق من توفر إعلامك بالمفتاح الأساسي في حالة وجوده. ثم في وقت لاحق إذا قمت باستدعاء أي من طريقة getter الكيان ثم يجلب كله.
لكن إحضار بطريقة ليزي lazy يكون ممكنًا عند محاولة إحضار السجل لأول مرة. بهذه الطريقة ، يتم تخزين نسخة من السجل بأكمله بالفعل في ذاكرة التخزين المؤقت. الأداء الحكيم ، وجلب باستخدام كسول lazy هو الأفضل.
التسميات: JPA
<< الصفحة الرئيسية