Desarrollo de aplicaciones que utilizan consultas EJB
La empresa JavaBeans (EJB) se utiliza para especificar una consulta sobre beans de entidad administrados 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 es compatible con el QL de EJB definido en Sun EJB. 2.1, EJB 3.0 y EJB 3.1 especificaciones y tiene capacidades adicionales como se enumeran en el tema Comparación de la especificación EJB y WebSphere® Lenguaje de consulta.
Procedimiento
Ejemplo: consultas con EJB
Aquí hay un ejemplo de empresa. JavaBeans (EJB), 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 finder 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