English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تفسير تفصيلي للفرق بين الاتصال الفوري والاتصال العادي في Hibernate

الفرق بين الاتصال العاجل لـ Hibernate والاتصال العادي

التعريفات والشرح الموجودة في الكود مذكورة، يمكن للجميع الرجوع إليها.

package com.baidu.test;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.baidu.leftJoin.Department;
import com.baidu.leftJoin.Employee;
public class TestHQL_LeftJoin {
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;
	@Before
	  public void init(){
		Configuration configuration = new Configuration().configure();
		ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
		                    .applySettings(configuration.getProperties())
		                    .buildServiceRegistry();
		sessionFactory = configuration.buildSessionFactory(serviceRegistry);
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
	}
	@After
	  public void destroy(){
		transaction.commit();
		session.close();
		sessionFactory.close();
	}
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~下面的例子是 从 1 对 多  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	/**
   *
   * 迫切左外连接: 特点是:如果左表有不满足条件的,也返回左表不满足条件
   *    1. LEFT JOIN FETCH 关键字表示迫切左外连接检索策略.
   *    2. list() 方法返回的集合中存放实体对象的引用, 每个 Department 对象关联的 Employee 集合都被初始化,
   *       存放所有关联的 Employee 的实体对象.
   *    3. 查询结果中可能会包含重复元素, 可以通过一个 HashSet 来过滤重复元素
   *
   *     حذف تکراری‌ها:
   *       方法一:使用 distinct
   *         String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps ";
   *        Query query = session.createQuery(hql);
   *
   *        List<Department> depts = query.list();
   *        System.out.println(depts.size());
   *       
   *       方法二
   *         String hql = "FROM Department d LEFT JOIN FETCH d.emps ";
   *        Query query = session.createQuery(hql);
   *
   *        List<Department> depts = query.list();
   *
   *        depts = new ArrayList<>(new LinkedHashSet(depts));
   *        System.out.println(depts.size());
   *        
   *        for(Department dept:depts){
   *          System.out.println(dept.getName() + "--" + dept.getEmps().size() );
   *        }
   *
   *
   */
	@Test
	  public void testLeftJoinFetch(){
		//    String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps ";
		//    Query query = session.createQuery(hql);
		//    
		//    List<Department> depts = query.list();
		//    System.out.println(depts.size());
		//    
		String hql = "FROM Department d LEFT JOIN FETCH d.emps ";
		Query query = session.createQuery(hql);
		List<Department> depts = query.list();
		System.out.println(depts.size());
		depts = new ArrayList<>(new LinkedHashSet(depts));
		System.out.println(depts.size());
		for (Department dept:depts){
			System.out.println(dept.getName() + "--" + dept.getEmps().size() );
		}
	}
	/**
   * جوینت چپ:
   *    1. کلمه کلیدی LEFT JOIN نشان‌دهنده جستجوی جوینت چپ است.
   *    2. مجموعه‌ای که توسط روش list() بازمی‌گردانده می‌شود شامل نوع آرایه‌ای از اشیاء است
   *    3. باید استراتژی جستجوی مجموعه Employee بر اساس فایل پیکربندی تعیین شود.
   *    4. اگر می‌خواهید که مجموعه‌ای که توسط روش list() بازمی‌گردانده می‌شود فقط شامل اشیاء Department باشد,
   *      می‌توان از کلمه کلیدی SELECT در جملات HQL استفاده کرد
   *    
   *    نتایج این جملات دارای تکراری‌ها خواهد بود:
   *      String hql = "FROM Department d LEFT JOIN d.emps";
   *      Query query = session.createQuery(hql);
   *    
   *      List<Object[]> results = query.list();
   *      System.out.println(results.size());
   *  
   *     حذف تکراری‌ها:
   *       فقط می‌توان از روش distinct برای حذف تکراری‌ها استفاده کرد
   *   
   *       String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps";
   *       Query query = session.createQuery(hql);
   *
   *       List<Department> depts = query.list();
   *       System.out.println(depts.size());
   *         
   *       for(Department dept:depts){
   *         System.out.println(dept.getName() + dept.getEmps().size());
   *       }
   *
   */
	@Test
	  public void testLeftJoin(){
		String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN d.emps";
		Query query = session.createQuery(hql);
		List<Department> depts = query.list();
		System.out.println(depts.size());
		for (Department dept:depts){
			System.out.println(dept.getName() + dept.getEmps().size());
		}
	}
	/**
   * الاتصال المضطرب:
   *    كلمة المفتاح INNER JOIN FETCH تعني الاتصال الداخلي المضطرب، يمكن أيضًا تجاهل كلمة المفتاح INNER
   *    يحتوي مجموعة العودة من طريقة list() على مراجع كائن Department، ويكون كل Department
   *        يتم تفعيل مجموعة Employee للكائن، وتخزن جميع كائنات Employee المرتبطة
   *
   * الاتصال الداخلي:
   *    كلمة المفتاح INNER JOIN تعني الاتصال الداخلي، يمكن أيضًا تجاهل كلمة المفتاح INNER
   *    يحتوي كل عنصر في مجموعة طريقة list() على سجل من نتائج الاستعلام، ويكون كل عنصر نوعًا من نطاق العناصر
   *    إذا كان يرغب المستخدم في أن تكون عودة طريقة list() تحتوي فقط على كائنات Department، يمكن استخدام كلمة المفتاح SELECT في جملة الاستعلام HQL
   *
   *
   *
   */
	@Test
	  public void testInnerJoinFetch(){
		//String hql = "SELECT DISTINCT d FROM Department d LEFT JOIN FETCH d.emps ";
		String hql = "FROM Department d INNER JOIN FETCH d.emps ";
		Query query = session.createQuery(hql);
		List<Department> depts = query.list();
		depts = new ArrayList<>(new LinkedHashSet(depts));
		System.out.println(depts.size());
		for (Department dept:depts){
			System.out.println(dept.getName() + "--" + dept.getEmps().size() );
		}
	}
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~ مثال التالي هو من ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	@Test
	  public void testLeftJoinFetch2(){
		String hql = "FROM Employee e LEFT JOIN FETCH e.dept";
		Query query = session.createQuery(hql);
		List<Employee> emps = query.list();
		System.out.println(emps.size());
		for (Employee emp:emps){
			System.out.println(emp + " -- " + emp.getDept());
		}
	}
}

الخاتمة

هذا هو كل محتوى المقال حول مثال على فرق الاتصال العاجل والاتصال العادي في Hibernate، نأمل أن يكون مفيدًا للجميع. يمكن للمهتمين بالاستمرار في مراجعة الموقع:

نقاش سريع حول مشكلة التحميل الفوري لـ Hibernate (التزامن مع المفاتيح الخارجية المتعددة)

تفصيل كود إجراءات Session CRUD في Hibernate

إذا كان هناك نقص، فالرجاء ترك تعليق. شكرًا للدعم من أصدقاء الموقع!

البيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الحقيقي بالحقوق، ويتم تقديم المحتوى من قبل مستخدمي الإنترنت بشكل متعاون، ويشغل هذا الموقع حقوق الملكية، ويتم التعامل مع المحتوى بشكل غير إنساني، ولا يشغل الموقع أي مسؤولية قانونية. إذا لاحظت أن هناك محتوى يخالف حقوق النسخ، فأنت مرحب بك في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (يرجى استبدال #بـ @ عند إرسال البريد الإلكتروني) لتقديم الشكوى، ويجب تقديم الدليل ذات الصلة، وسيقوم الموقع فورًا بإزالة المحتوى المزعوم الذي يخالف حقوق النسخ.

من المحتمل أن تُحبها