Utilización de la consulta EJB
El lenguaje de consulta EJB (Enterprise JavaBeans) se utiliza para especificar consultas en beans de entidad gestionadas por contenedor. El lenguaje es como un lenguaje de consulta estructurado (SQL o Structured Query Language). Las consultas EJB son independientes de la correlación del bean con un almacén persistente.
Acerca de esta tarea
- Para definir un método finder de un bean de entidad EJB.
- Para definir un método select de un bean de entidad EJB.
- Para especificar dinámicamente una consulta con la API dinámica de método executeQuery().
El lenguaje de consulta EJB del producto cumple con el lenguaje de consulta EJB definido en las especificaciones Sun EJB 2.1, EJB 3.0 y EJB 3.1 y tiene prestaciones adicionales que se indican en el tema Comparación de la especificación EJB y el lenguaje de consulta de WebSphere.
Procedimiento
Ejemplo: consultas con EJB
El siguiente es un esquema EJB (Enterprise JavaBeans) de ejemplo, seguido de un conjunto de consultas de ejemplo.
Esquema EJB | Consulta de ejemplo |
---|---|
Nombre de bean de entidad (nombre de EJB) | DeptEJB (no se utiliza en la consulta) |
Nombre de esquema abstracto | DeptBean |
Clase de implementación | com.acme.hr.deptBean (no se utiliza en la consulta) |
Atributos persistentes (campos cmp) |
|
Relaciones |
|
Esquema EJB | Consulta de ejemplo |
---|---|
Nombre de bean de entidad (nombre de EJB) | EmpEJB (no se utiliza en la consulta) |
Nombre de esquema abstracto | EmpBean |
Clase de implementación | com.acme.hr.empBean (no se utiliza en la consulta) |
Atributos persistentes (campos cmp) |
|
Relaciones |
|
public class com.acme.hr.Address extends Object implements Serializable {
public String street;
public String state;
public String city;
public Integer zip;
public double distance (String start_location) { ... } ;
public String format ( ) { ... } ;
}
SELECT OBJECT(d) FROM DeptBean d
SELECT OBJECT(d) FROM DeptBean d WHERE d.name LIKE 'Web%' ORDER BY d.name
SELECT OBJECT(d) FROM DeptBean d WHERE d."select" > 5
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
SELECT OBJECT(d) FROM DeptBean d, IN (d.emps) AS e
WHERE e.salary BETWEEN 50000 and 90000
Hay una operación conjunta implícita en esta consulta entre cada objeto de departamento y su agrupación de empleados relacionados. Si un departamento no tiene empleados, el departamento no aparecerá en el resultado. Si un departamento tiene más de un empleado que gana más de 50000, este departamento aparecerá varias veces en el resultado.
SELECT DISTINCT OBJECT(d) from DeptBean d, IN (d.emps) AS e WHERE e.salary > 50000
SELECT OBJECT(e) FROM EmpBean e where e.bonus > 0.40 * e.salary
SELECT OBJECT(d) FROM DeptBean d where d.budget <
( SELECT SUM(e.salary+e.bonus) FROM IN(d.emps) AS e )
SELECT OBJECT(e) FROM EmpBean e where year( '2000-01-01' - e.hireDate ) >= 20
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate < 631180800232
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
SELECT OBJECT(e) FROM EmpBean e, EmpBean b
WHERE b.name = 'Bob' AND e.salary + e.bonus > b.salary + b.bonus
SELECT OBJECT(e) from EmpBean e WHERE e.bonus =
(SELECT MAX(e1.bonus) from EmpBean e1)
Las consultas indicadas anteriormente devuelven todas objetos EJB. Un método buscador siempre debe devolver un objeto EJB como inicio. Una consulta de método select puede además devolver campos CMP u otros objeto EJB que no pertenecen al inicio.
SELECT d.mgr FROM DeptBean d
SELECT d.mgr.name FROM DeptBean d WHERE d.deptno = 42
SELECT e.name FROM EmpBean e WHERE e.dept.deptno=42
SELECT e.name from DeptBean d, IN (d.emps) AS e WHERE d.deptno=42
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
SELECT e.name, e.salary+e.bonus as total_pay , object(e), e.dept.mgr
FROM EmpBean e
ORDER BY 2
SELECT e.dept.deptno as department_number , count(*) as employee_count
FROM EmpBean e
GROUP BY by e.dept.deptno
ORDER BY 1
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e