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를 사용할 수 있습니다.
   *
   *     去重:
   *       메서드 1: 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());
   *       
   *       메서드 2
   *         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() 方法的集合中存放的每个元素对应查询结果的一条记录, 每个元素都是对象数组类型
   *    如果希望 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 긴급 로드 문제(다중 외부 키 연결)에 대해 간단히 이야기

헬리브레이션에서 세션 추가, 삭제, 변경, 검색 작업 코드 설명

불충분한 부분이 있으면 댓글을 통해 지적해 주시기 바랍니다. 친구 여러분의 사이트 지원에 감사합니다!

성명: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은原作者에게 있으며, 인터넷 사용자가 자발적으로 기여하고 자체로 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면 이메일을 보내주시기 바랍니다: notice#oldtoolbag.com(이메일을 보내는 경우 #을 @으로 변경하십시오. 신고를 하시고 관련 증거를 제공하시면, 사실이 확인되면 해당 사이트는 즉시 저작권 침해 내용을 삭제합니다。)

좋아하는 것