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オブジェクトのみを含めたい場合、
   *      HQLクエリ文でSELECTキーワードを使用できます。
   *    
   *    このクエリ文の結果には重複があります:
   *      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() メソッドのコレクションに格納されている各要素は、クエリ結果の1レコードに対応しており、各要素はオブジェクト配列のタイプです
   *    もし list() メソッドの返却するコレクションが Department オブジェクトのみを含むようにしたい場合は、HQL クエリ文に SELECT キーワードを使用することができます
   *
   *
   *
   */
	@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() );
		}
	}
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~以下の例は、複数から一つの関係を取得するものです 1  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	@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の急速読み込み問題(多重外部キー関連)について簡単に説明

HibernateでのSessionのCRUD操作コードの詳細

不十分な点があれば、コメントをいただければ幸いです。皆様のサポートに感謝します!

声明:この記事の内容はインターネットから取得され、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、当サイトは権利を所有しておらず、人工的に編集されていないため、関連する法的責任を負いません。著作権侵害を疑う内容があれば、メールを送信してください:notice#oldtoolbag.com(メールを送信する際には、#を@に変更してください。届出を行い、関連する証拠を提供してください。一旦確認がついた場合、当サイトは直ちに侵害を疑われる内容を削除します。)

おすすめ