2010-09-07 16 views
5

Imagínese una mesa emp:JPA ¿Optimización de consultas al evitar JOIN para buscar tabla?

CREATE TABLE emp 
(id   NUMBER 
, name   VARCHAR 
, dept_code VARCHAR 
) 

y una tabla dept :

CREATE TABLE dept 
(code   VARCHAR 
, name   VARCHAR 
) 

emp.dept_code referencias dept.code como ForeignKey.

Estas tablas se asignan a entidades JPA, y el ForeignKey se modela como una asociación:

@ManyToOne 
@JoinColumn(name = "dept_code") 
private Department department; 

Teniendo en cuenta los siguientes datos:

emp      dept  
----------------  ------------------ 
1 John SALS  SALS  Sales 
2 Louis SALS  SUPT  Support 
3 Jack SUPT 
4 Lucy SUPT 

me gustaría escribir una consulta JPA que devuelve todos Emloyees en el Departamento de Soporte. Asumo que PrimaryKey del Departamento de Apoyo (SUPT)

supongo que sería:

SELECT emp 
    FROM Employee emp JOIN emp.department dept 
WHERE dept.code = 'SUPT' 

Pregunta:

A medida que la clave de código Departamento SUPT está disponible en el emp tabla, ¿hay alguna manera de volver a escribir la consulta JPA al evitar el UNIRSE a la Entidad del Departamento?

¿Esto daría como resultado una mejora en el rendimiento? ¿O es una implementación de JPA (como Hibernate) lo suficientemente inteligente como para evitar que la base de datos se una a la dept tabla?

Respuesta

3

que se suele escribir la consulta como

select emp 
from employee emp 
where emp.department.code = 'SUPT' 

y dejar que su figura proveedor de la mejor manera para llegar a los resultados. En el caso de la hibernación, sí, es lo suficientemente inteligente como para darse cuenta de que solo puede mirar la columna de unión.

edición: Vale la pena señalar, que no se ha configurado la carga diferida en sus anotaciones, por lo que va a unirse a la mesa para crear la entidad departamento de todos modos :)

Cuestiones relacionadas