2010-08-04 18 views
7

estoy seguro de que estoy siendo estúpido, pero me parece que no puede imaginar éste ...APP izquierda se unen para encontrar las entradas no utilizadas

Tengo dos tablas:

departamento (DID, nombre) empleado (eid, primero, último, lo hizo)

tienen entidades correspondientes JPA entidades administradas Departamento y Empleado. El empleado tiene un campo de Departamento, el Departamento no mantiene una lista de Empleados. Lo que quiero hacer es encontrar todos los departamentos que no tienen empleados. Usar SQL antiguo simple esto es fácil con una combinación izquierda:

SELECT d.* 
FROM department as d LEFT OUTER JOIN employee as e 
ON d.did = e.did 
WHERE e.did IS NULL 

No veo cómo traducir esta consulta a JPQL. Todos los ejemplos que he encontrado para JPQL left join recorren el enlace a la inversa, por ejemplo.

SELECT e FROM Employee e LEFT JOIN e.departmert d 

Mientras que necesito algo más como

SELECT d FROM Department d LEFT JOIN d.???? WHERE e.department IS NULL 

pero el departamento no mantiene una referencia a sus empleados (en mi solicitud no es, obviamente, departamentos y empleados). ¿Es esto posible en JPQL?

Respuesta

9

Para hacer lo que estás tratando de hacer, necesitarías configurar un mapeo desde Departments -> Employees (usando tus entidades de ejemplo). Se podría utilizar el atributo mappedBy de @OneToMany, que muy probablemente no interrumpirá su esquema, por ejemplo,

@Entity 
class Department { 
    ... 
    @OneToMany(mappedBy="employee") 
    Collection<Employee> getEmployees() { 
     .... 
    } 
    ... 
} 

Esto permitirá ejecutar algo como:

SELECT d FROM Department d WHERE d.employees IS EMPTY 

que debe dar resultados equivalentes.

Sin alterar su asignación, debe ser capaz de ejecutar algo como esto consulta para obtener los resultados que desea:

SELECT d from Department d WHERE NOT EXIST (SELECT e FROM Employee e where e.department = d) 
+0

brillante, perfecta respuesta gracias. Fuimos a la consulta en lugar de configurar la asignación. Estoy seguro de que la consulta no es muy eficiente, pero no se llamará con mucha frecuencia. – wobblycogs

+0

¿Se debe usar "ESTÁ VACÍO" también cuando el artículo no es una colección, pero es solo una entidad de OneToOne con mappedBy? editar: sí, eso funciona. – Amalgovinus

Cuestiones relacionadas