الثلاثاء، 12 نوفمبر 2019

ماهو 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 يحتوي على السجلات التالية.

EidEnameSalaryDeg
1201Gopal40000Technical Manager
1202Manisha40000Proof Reader
1203Masthanvali40000Technical Writer
1204Satish30000Technical Writer
1205Krishna30000Technical Writer
1206Kiran35000Proof 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 هو الأفضل.














التسميات: