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

Uma consulta EJB pode ser utilizada em três situações:
  • 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.
As consultas finder e select são especificadas no descritor de implementação do bean usando a tag <ejb-ql>; elas são compiladas em SQL durante a implementação. Consultas dinâmicas são incluídas no código do aplicativo efetivo.

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.

Tabela 1. Esquema EJB e Consultas de Exemplo. Esquema EJB e 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)
  • deptno - Integer (chave)
  • name - String
  • budget - BigDecimal
Relacionamentos
  • emps - 1:Muitos com EmpEJB
  • mgr - Muitos:1 com EmpEJB
Tabela 2. Esquema EJB e Consultas de Exemplo. Esquema EJB e Consultas de Exemplo
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)
  • empid - Integer (chave)
  • name - String
  • salary - BigDecimal
  • bonus - BigDecimal
  • hireDate - java.sql.Date
  • birthDate - java.util.Calendar
  • address - com.acme.hr.Address
Relacionamentos
  • dept - Muitos:1 com DeptEJB
  • manages - 1:Muitos com DeptEJB
Address é um objeto seriável utilizado como campo cmp em EmpBean. A definição de address é a seguinte:
    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 ( ) { ... } ;
 }
A consulta a seguir retorna todos os departamentos:
SELECT OBJECT(d) FROM DeptBean d
A consulta a seguir retorna departamentos cujo nome comece com as letras "Web". Classificar o resultado por nome:
SELECT OBJECT(d) FROM DeptBean d WHERE  d.name LIKE  'Web%' ORDER BY d.name
As palavras-chave SELECT e FROM são mostradas em letra maiúscula nos exemplos, mas não fazem distinção entre maiúsculas e minúsculas. Se um nome usado em uma consulta for uma palavra reservada, o nome deve ser inserido entre aspas duplas para ser usado na consulta. Você pode localizar uma lista de palavras reservadas no Consulta EJB: Palavras Reservadas. Identificadores inseridos entre aspas duplas fazem distinção entre maiúsculas e minúsculas. Este exemplo mostra como usar um campo cmp que é uma palavra reservada:
SELECT OBJECT(d) FROM DeptBean d  WHERE  d."select" > 5
A consulta a seguir retorna todos os funcionários que são gerenciados por Bob. Este exemplo mostra como navegar caminhos utilizando uma expressão de caminho:
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
Uma consulta pode conter um parâmetro que se refira ao valor correspondente do método finder ou select. Os parâmetros da consulta são numerados, começando por 1:
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
Esta consulta mostra a navegação de um relacionamento com múltiplos valores e retorna todos os departamentos que têm um funcionário que ganha pelo menos 50000 mas não mais que 90000:
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.

A consulta a seguir elimina os departamentos duplicados:
SELECT DISTINCT OBJECT(d) from DeptBean d,  IN (d.emps) AS e  WHERE e.salary > 50000
Localizar os funcionários cujo bônus seja mais que 40% se seu salário:
SELECT OBJECT(e) FROM EmpBean e where e.bonus > 0.40 * e.salary
Localizar departamentos onde a soma de salário e bônus dos funcionários no departamento exceder o orçamento do departamento:
SELECT OBJECT(d) FROM DeptBean d where d.budget < 
( SELECT SUM(e.salary+e.bonus) FROM IN(d.emps) AS e )
Uma consulta pode conter expressões aritméticas de data/hora em estiloDB2 se você usar tipos de dados java.sql.* como campos CMP e o seu armazenamento de dados for DB2. Localizar todos os funcionários que trabalharam pelo menos 20 anos até 1º de janeiro de 2000.
SELECT OBJECT(e) FROM EmpBean e where year(  '2000-01-01' - e.hireDate ) >= 20
Se o armazenamento de dados não for DB2 ou se você preferir usar o java.util.Calendar como o campo CMP, então é possível usar o valor millsecond da Java em consultas. A consulta a seguir localiza todos os funcionários nascidos antes de 1º de janeiro de 1990:
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate <  631180800232
Localizar departamentos sem funcionários:
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
Localizar todos os funcionários que ganham mais que Bob:
SELECT OBJECT(e) FROM EmpBean e, EmpBean b
WHERE b.name = 'Bob' AND e.salary + e.bonus > b.salary + b.bonus
Localizar o funcionário com o maior bônus:
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.

As seguintes seriam consultas de método select válidas para EmpBean. Retornar o gerente para cada departamento:
SELECT  d.mgr FROM DeptBean d
Retornar o nome do gerente do departamento 42:
SELECT  d.mgr.name FROM DeptBean d WHERE  d.deptno = 42
Retornar os nomes dos funcionários do departamento 42:
SELECT e.name FROM EmpBean e WHERE  e.dept.deptno=42
Outra maneira de escrever a mesa consulta é:
SELECT e.name from DeptBean d, IN (d.emps) AS e WHERE d.deptno=42
As consultas de finder e select permitem apenas um único campo CMP ou EJBObject na cláusula SELECT. Uma consulta de select pode retornar valores agregados no Enterprise JavaBeans 2.1 usando SUM, MIN, MAX, AVG e COUNT.
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
A API de consulta dinâmica permite várias expressões na cláusula SELECT. A consulta a seguir seria uma consulta dinâmica válida, mas não uma consulta de select ou finder válida:
SELECT  e.name, e.salary+e.bonus as total_pay , object(e), e.dept.mgr
FROM  EmpBean e
ORDER BY 2
A consulta dinâmica a seguir retorna o número de funcionários em cada departamento:
SELECT e.dept.deptno as department_number , count(*) as employee_count
FROM  EmpBean e
GROUP BY  by e.dept.deptno
ORDER BY 1
A API de consulta dinâmica permite consultas que contêm métodos de objeto de bean ou valor:
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e

Ícone que indica o tipo de tópico Tópico de Tarefa



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tque_ep
Nome do arquivo: tque_ep.html