Utilizando Consulta EJB
A linguagem de consulta Enterprise JavaBeans (EJB) é utilizada para especificar uma consulta sobre beans de entidade gerenciados por contêiner. A liguagem é semelhante à SQL (Structured Query Language). Uma consulta EJB é independente do mapeamento do bean para um armazenamento persistente.
Sobre Esta Tarefa
- Para definir um método finder de um bean de entidade EJB.
- Para definir um método select de um bean de entidade EJB.
- Para especificar dinamicamente uma consulta utilizando a API dinâmica do método executeQuery.
A linguagem de consulta EJB do produto é compatível com a EJB QL definida nas especificações Sun EJB 2.1, EJB 3.0 e EJB 3.1 e possui recursos adicionais conforme listados no tópico Comparação de especificação EJB e WebSphere Query Language.
Procedimento
Exemplo: Consultas com EJB
Aqui está um esquema do Enterprise JavaBeans (EJB), seguido por um conjunto de consultas de exemplo.
Esquema EJB | Consulta de Exemplo |
---|---|
Nome do bean de entidade (nome de EJB) | DeptEJB (não utilizado na consulta) |
Nome do esquema abstrato | DeptBean |
Classe de Implementação | com.acme.hr.deptBean (não utilizado na consulta) |
Atributos persistentes (campos cmp) |
|
Relacionamentos |
|
Esquema EJB | Consulta de Exemplo |
---|---|
Nome do bean de entidade (nome de EJB) | EmpEJB (não utilizado na consulta) |
Nome do esquema abstrato | EmpBean |
Classe de Implementação | com.acme.hr.empBean (não utilizado na consulta) |
Atributos persistentes (campos cmp) |
|
Relacionamentos |
|
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
Existe uma operação de união implicada nesta consulta entre cada objeto de departamento e sua coleção de funcionários relacionada. Se um departamento não tiver funcionários, o departamento não aparecerá no resultado. Se um departamento tiver mais que um funcionário que ganhe mais que 50000, esse departamento aparecerá várias vezes no 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)
Todas as consultas listadas anteriormente retornam objetos EJB. Uma consulta do método finder deve sempre retornar um Objeto EJB para o início. Uma consulta do método select pode, além disso, retornar campos CMP ou outros Objetos EJB não pertencentes ao início.
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