Por favor me ayude a entender a donde el uso regular de UNIRSE y donde un JOIN FETCH.

Por ejemplo, si tenemos estas dos consultas

FROM Employee emp
JOIN emp.department dep

y

FROM Employee emp
JOIN FETCH emp.department dep

Hay alguna diferencia entre ellos? Si sí, cual usar cuando?

  • usted puede encontrar aquí enlace leer 14.3. Asociaciones y uniones
  • He ido a través de la que documententation pero todavía no sé donde debo usar una combinación y donde un JOIN FETCH.
  • Si usted tiene @oneToOne asignación de conjunto a FetchType.PEREZOSO y uso de la segunda consulta(porque necesita el Departamento de objetos que se cargan como parte de un Empleado de objetos) lo que Hibernate hacer es, emitirá las consultas a buscar Departamento de objetos para cada Empleado individual objeto se obtiene a partir de DB. Más adelante en el código se puede acceder Departamento de objetos a través de los Empleados del Departamento de valor único de asociación y de Hibernación no emitir ningún tipo de consulta a fin de obtener Departamento de objeto para el Empleado. Recuerde Hibernate temas de las consultas igual al número de Empleados se ha recuperado.
  • Para ayudar en el doc hunt ~ Estrategias de Recuperación
InformationsquelleAutor abbas | 2013-07-02

4 Comentarios

  1. 152

    Esta consulta, usted está utilizando UNIRSE a la consulta de todos los empleados que tienen al menos un departamento asociados.

    Pero, la diferencia es: en la primera consulta se devuelve solo los Empleados de la Hibernación. En la segunda consulta, se están volviendo a los Empleados y todos los Departamentos asociados.

    Por lo tanto, si se utiliza la segunda consulta, usted no tendrá que hacer una nueva consulta a golpear de nuevo la base de datos para ver los Departamentos de cada Empleado.

    Puede utilizar la segunda consulta cuando esté seguro de que tendrá el Departamento de cada Empleado. Si usted no necesita el Departamento, el uso de la primera consulta.

    Recomiendo leer este enlace si usted necesita solicitar algunos DONDE la condición (lo que probablemente necesite): Cómo expresar adecuadamente JPQL «join fetch» con la cláusula «where» como JPA 2 CriteriaQuery?

    Actualización

    Si no uso fetch y los Departamentos de continuar a ser devuelto, porque su asignación entre Empleado y Departamento (un @OneToMany) son programados con FetchType.EAGER. En este caso, cualquier HQL (con fetch o no) consulta con FROM Employee va a llevar a todos los Departamentos. Recuerde que todos mapeo *Tono (@ManyToOne y @OneToOne) están ANSIOSOS por defecto.

    • Que el comportamiento será si ejecutamos la instrucción sin buscar y obtener el resultado. A continuación, dentro de la sesión vamos a tratar a su departamento?
  2. 56

    en en este enlace he mencionado antes en el comentario, leer esta parte :

    Un «fetch» join permite a las asociaciones o a las colecciones de los valores a ser
    inicializa junto con sus padres de objetos mediante una selección única.
    Esto es particularmente útil en el caso de una colección. Es
    efectivamente anula la combinación externa y perezoso declaraciones de la
    el archivo de asignación de
    para las asociaciones y de las colecciones.

    este «JOIN FETCH» tendrá efecto si usted tiene (fetch = FetchType.PEREZOSO) propiedad de una colección dentro de la entidad(ejemplo abajo).

    Y es sólo el efecto del método de «cuando la consulta debe suceder». Y también debe saber este:

    hibernate tiene dos ortogonales nociones : cuando es la asociación recopila y cómo
    se recupera. Es importante que no se confunda. Utilizamos
    fetch para ajustar el rendimiento. Podemos utilizar perezoso para definir un contrato para
    lo que los datos estén siempre disponibles en cualquier instancia separada de un particular
    clase.

    cuando es la asociación de exagerado –> su «BÚSQUEDA» tipo

    cómo se recupera –> Unir/seleccionar/Subselección/Lote

    En su caso, OBTENER sólo tiene efecto si usted tiene el departamento como un conjunto dentro de los Empleados, algo como esto en la entidad:

    @OneToMany(fetch = FetchType.LAZY)
    private Set<Department> department;

    cuando se utiliza

    FROM Employee emp
    JOIN FETCH emp.department dep

    obtendrá emp y emp.dep. cuando no utilizar fetch usted todavía puede obtener emp.dep pero hibernate procesamiento de otro select a la base de datos para conseguir que el conjunto de departamento.

    tan solo una cuestión de optimización del rendimiento, sobre el que desea obtener el resultado(que usted necesita o no) en una sola consulta(con ganas de buscar), o desea realizar una consulta último, cuando se la necesita(recuperación perezosa).

    Uso con ganas de ir a buscar cuando usted necesita para obtener datos pequeños con un select(uno grande de la consulta). O el uso de la recuperación perezosa para consultar lo que usted necesita último(muchos de los más pequeños de la consulta).

    utilizar fetch cuando :

    • no hay grandes innecesarios colección/set dentro de la entidad acerca de para obtener

    • de comunicación desde el servidor de aplicaciones para servidor de base de datos demasiado lejos y necesita mucho tiempo

    • usted puede necesitar que la recolección de estos últimos cuando no tienen acceso a ella(fuera de la transaccional método/clase)

    • Se podría explicar por las consultas que acabo de escribir en la actualización de la pregunta.
    • hecho, espero que esto ayude.
    • útil consideración : «no hay grandes innecesarios colección/set en el interior de esa entidad a punto de llegar»
    • Iba a los departamentos de estar todavía con entusiasmo exagerado si los departamentos dentro de la empleado fue un List en lugar de un Set ?
    • Tiene el uso de la FETCH palabra clave en un JPQL declaración implica una etapa recuperado de la propiedad ?
  3. 4

    Si usted tiene @oneToOne asignación de conjunto a FetchType.PEREZOSO y uso de la segunda consulta(porque necesita el Departamento de objetos que se cargan como parte de un Empleado de objetos) lo que Hibernate hacer es, emitirá las consultas a buscar Departamento de objetos para cada Empleado individual objeto se obtiene a partir de DB. Más adelante en el código se puede acceder Departamento de objetos a través de los Empleados del Departamento de valor único de asociación y de Hibernación no emitir ningún tipo de consulta a fin de obtener Departamento de objeto para el Empleado. Recuerde Hibernate temas de las consultas igual al número de Empleados se ha recuperado. Hibernate problema mismo número de las consultas en consultas anteriores si desea acceder al Departamento de objetos de todos los Empleados objetos

  4. 1

    Dherik : no estoy seguro de lo que dices, cuando no se utiliza recuperar el resultado será de tipo : List<Object[ ]> lo que significa una lista de Objetos de tablas y no una lista de los Empleados.

    Object[0] refers an Employee entity 
    Object[1] refers a Departement entity 

    Cuando se utiliza fetch, sólo hay uno seleccione y el resultado es la lista de los Empleados List<Employee> que contiene la lista de departamentos. Reemplaza el perezoso declaración de la entidad.

    • No sé si entiendo su preocupación. Si no utiliza fetch, la consulta devolverá sólo los Empleados. Si los Departamentos, incluso en este caso, pasa a ser devuelto, se debe a que su asignación entre Empleado y Departamento (un @OneToMany) son programados con FetchType.Con GANAS. En este caso, cualquier HQL (con fetch o no) consulta con FROM Employee va a llevar a todos los Departamentos.
    • Sin el uso de fetch (unirse a plazo), el resultado sería una matriz de colecciones, dos filas, la primera es una colección de los Empleados y la segunda es una colección de los Departamentos. El uso de ganas de recuperar o perezoso fetch, departamentos se recuperarán.
    • Sin fetch en HQL, esto sólo sucederá si su asignación entre el Empleado y el Departamento están ANSIOSOS (@OneToMany(fetch = FetchType.EAGER). Si no es el caso, de los Departamentos no serán devueltos.
    • pruébelo usted mismo, Usted obtendrá una ClassCastException.
    • Averiguar el problema. No es una captura del problema, pero, ¿cómo la select se hizo en el HQL. Trate de SELECT emp FROM Employee emp JOIN FETCH emp.department dep. JPA/Hibernate tiene este comportamiento de devolver un List de Object[] cuando ommit la SELECT parte.

Dejar respuesta

Please enter your comment!
Please enter your name here