Relativamente nuevo para JPA, así que tengo un tipo de pregunta arquitectónica. Digamos que tengo tablas EMPLEADO y DEPARTAMENTO con relación de muchos a uno (es decir, muchos empleados trabajan para un departamento):JPA - columna calculada como propiedad de clase de entidad?
EMPLOYEE
EMPLOYEE_ID
EMPLOYEE_NAME
DEPARTMENT_ID
DEPARTMENT
DEPARTMENT_ID
DEPARTMENT_NAME
, así que puede definir entidades adecuadas para los empleados y Departamento, no hay problema. Sin embargo, en una sola vista me gustaría mostrar lista de departamentos con el número de empleados que trabajan para ese departamento, algo como esto:
SELECT D.DEPARTMENT_NAME,
(SELECT COUNT(*) FROM EMPLOYEE E WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID) NUMBER_OF_EMPLOYEES
FROM DEPARTMENT D
No estoy seguro de lo que es la estrategia adecuada para lograr esto usando JPA. .. No quiero buscar siempre el número de empleados para la entidad del Departamento, ya que solo hay una vista cuando es necesaria.
Parece que la @Formula de Hibernate sería un posible enfoque, pero afaik no cumple con el estándar JPA.
Gracias @MattR por su respuesta. Esta solución podría funcionar para este simple ejemplo. Pero, ¿qué pasa si (a) la tabla DEPARTAMENTO tiene muchas otras columnas además de NOMBRE y, obviamente, no quiero enumerarlas todas en el constructor y (b) todavía quiero tenerlo como propiedad de la entidad del Departamento (con búsqueda PERDIDA? tipo) para ser accesible en otro lugar por si acaso. – AndreiM
Buena pregunta, no lo he intentado pero creo que * puede usar clases de entidad en el constructor (por lo que no necesitaría seleccionar todas las propiedades de la entidad). Si tengo la oportunidad de probarlo, actualizaré mi respuesta ... es decir, podría tener una clase de DepartmentEmployees (por ejemplo) que tuviera un constructor DepartmentEmployees (Department, Integer) y usar SELECT nuevos DepartmentEmployees (D, count (E.id))) - no es exactamente lo que estás pidiendo pero está más cerca ... – MattR
OK Estaba pensando en esto durante el almuerzo, así que actualicé algo de información extra. Si intenta alguna de las sugerencias o encuentra una solución mejor, informe de nuevo – MattR