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

Ejemplo detallado de la diferencia entre conexión urgente y conexión normal de Hibernate

La diferencia entre la conexión de conexión urgente de Hibernate y la conexión común

La introducción y explicación relacionadas se han comentado en el código, los puede referirse.

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();
	}
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~El siguiente ejemplo es de 1 Para mucho  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	/**
   *
   * Conexión externa izquierda apremiante: la característica es: si la tabla izquierda no cumple con los requisitos, también se devuelve la tabla izquierda que no cumple con los requisitos
   *    1. La palabra clave LEFT JOIN FETCH representa la estrategia de recuperación de conexión externa izquierda apremiante.
   *    2. La colección devuelta por el método list() contiene referencias a objetos entidad, cada colección de Employee asociada con un objeto Department se ha inicializado
   *       . Almacena todos los objetos entidad asociados Employee.
   *    3. Los resultados de la consulta pueden contener elementos repetidos, que se pueden filtrar mediante un HashSet
   *
   *     Eliminación de duplicados:
   *       Método uno: usar 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());
   *       
   *       Método dos
   *         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() );
		}
	}
	/**
   * Conexión externa izquierda:
   *    1. La palabra clave LEFT JOIN representa la consulta de conexión externa izquierda.
   *    2. La colección devuelta por el método list() contiene un tipo de array de objetos
   *    3. La estrategia de recuperación de la colección Employee se decide según el archivo de configuración.
   *    4. Si desea que la lista() devuelva una colección que solo contenga objetos Department
   *      Se puede usar la palabra clave SELECT en la sentencia de consulta HQL
   *    
   *    Los resultados de la consulta de esta sentencia tienen duplicados:
   *      String hql = "FROM Department d LEFT JOIN d.emps";
   *      Query query = session.createQuery(hql);
   *    
   *      List<Object[]> results = query.list();
   *      System.out.println(results.size());
   *  
   *     Eliminación de duplicados:
   *       Solo se puede usar el método distinct para eliminar duplicados
   *   
   *       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());
		}
	}
	/**
   * Conexión interna forzada: la característica es: no devuelve la tabla izquierda que no cumple con los requisitos
   *    La palabra clave INNER JOIN FETCH representa la conexión interna forzada, también se puede omitir la palabra clave INNER
   *    La colección devuelta por el método list() almacena referencias a objetos Department, cada Department
   *        Las colecciones de Employee de los objetos se inicializan, almacenando todos los objetos Employee asociados
   *
   * Conexión interna:
   *    La palabra clave INNER JOIN representa la conexión interna, también se puede omitir la palabra clave INNER
   *    Cada elemento de la colección del método list() coincide con un registro de los resultados de la consulta, y cada elemento es de tipo matriz de objetos
   *    Si desea que la colección devuelta por el método list() solo contenga objetos Department, puede usar la palabra clave SELECT en la consulta 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() );
		}
	}
	// ~~~~~~~~~~~~~~~~~~~~~~~~~~El siguiente ejemplo es de 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());
		}
	}
}

Resumen

Esto es todo sobre la explicación detallada de los ejemplos de la diferencia entre la conexión de conexión urgente y la conexión común en Hibernate. Espero que sea útil para todos. Los amigos interesados pueden continuar consultando nuestro sitio web:

Un análisis breve sobre el problema de carga anticipada de hibernate (asociaciones de claves foráneas múltiples)

Explicación detallada del código de operaciones de creación, eliminación, actualización y consulta de sesión en Hibernate

Si hay algo que no esté bien, por favor déjenos un mensaje. ¡Gracias a todos los amigos por su apoyo a nuestro sitio!

Declaración: Este artículo se comparte de la red, pertenece al propietario original, el contenido se comparte de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha editado editorialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#w.3Declaración: El contenido de este artículo se obtiene de la red, pertenece al propietario original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio web no posee los derechos de propiedad, no se ha procesado editorialmente y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de copyright, por favor envíe un correo electrónico a: notice#w proporcionando pruebas relacionadas, una vez que se verifique, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará también