EJB 조회 사용
EJB(Enterprise JavaBeans) 조회 언어는 컨테이너 관리 엔티티 Bean에 대해 조회를 지정하는 데 사용됩니다. 언어는 SQL(Structured Query Language)과 유사합니다. EJB 조회는 지속적 저장에 대한 Bean 맵핑과 무관합니다.
이 태스크 정보
EJB 조회는 다음 세 가지 상황에서 사용할 수 있습니다.
- EJB 엔티티 Bean의 파인더 메소드 정의
- EJB 엔티티 Bean의 선택 메소드 정의
- executeQuery 메소드 동적 API를 사용하여 동적으로 조회 지정
제품 EJB 조회 언어는 Sun EJB 2.1, EJB 3.0 및 EJB 3.1 스펙에서 정의된 EJB QL을 준수하고 EJB 스펙과 WebSphere® 조회 언어의 주제 비교에 나열되는 것으로서 추가 용량을 가지고 있습니다.
프로시저
예: EJB로 조회
예제 EJB(Enterprise JavaBean)가 일련의 예제 쿼리가 이어지는 스키마가 있습니다.
EJB 스키마 | 예제 조회 |
---|---|
EJB 이름(Entity bean 이름) | DeptEJB (조회에 사용되지 않음) |
추상 스키마 이름 | DeptBean |
구현 클래스 | com.acme.hr.deptBean (조회에 사용되지 않음) |
지속적 속성(cmp 필드) |
|
관계 |
|
EJB 스키마 | 예제 조회 |
---|---|
EJB 이름(Entity bean 이름) | EmpEJB (조회에 사용되지 않음) |
추상 스키마 이름 | EmpBean |
구현 클래스 | com.acme.hr.empBean (조회에 사용되지 않음) |
지속적 속성(cmp 필드) |
|
관계 |
|
주소는 EmpBean에서 cmp 필드로 사용되는 직렬화 가능 오브젝트입니다.
주소의 정의는 다음과 같습니다.
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
다음 조회는 "Web" 문자로 시작하는 이름의 부서를 리턴합니다.
이름별로 결과를 정렬합니다.
SELECT OBJECT(d) FROM DeptBean d WHERE d.name LIKE 'Web%' ORDER BY d.name
키워드 SELECT 및 FROM은 예에서 대문자로 표시되지만, 대소문자를 구분하지 않습니다. 조회에서 사용된 이름이 예약어인 경우, 이름은 조회에서 사용될 큰따옴표로 묶여야 합니다. EJB 조회: 예약어에서
예약어 목록을 찾을 수 있습니다.
큰따옴표로 묶인 ID는 대소문자 구분입니다. 다음 예에서는 예약어인 cmp 필드 사용법을 보여줍니다.
SELECT OBJECT(d) FROM DeptBean d WHERE d."select" > 5
다음 조회는 Bob이 관리하는 모든 직원을 리턴합니다. 다음 예에서는 경로 표현식을 사용하여 관계를 탐색하는 방법을 보여줍니다.
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name='Bob'
조회는
파인더 또는 선택 메소드의 해당 값을 참조하는 매개변수를 포함할 수 있습니다. 조회 매개변수는 1부터 시작하여 번호가 매겨집니다.
SELECT OBJECT (e) FROM EmpBean e WHERE e.dept.mgr.name= ?1
다음 조회에서는 다중 값을 가진 관계의 탐색을 보여주며, 50000 이상 90000
이하를 받는 직원이 있는 모든 부서를 리턴합니다.
SELECT OBJECT(d) FROM DeptBean d, IN (d.emps) AS e
WHERE e.salary BETWEEN 50000 and 90000
이 조회에서는 각 부서 오브젝트와 직원의 관련 콜렉션 간의 결합 조작이 암시적으로 나타나 있습니다. 부서에 직원이 없을 경우, 부서는 결과에 나타나지 않습니다. 부서에 50000보다 많이 받는 직원이 둘 이상 있을 경우, 해당 부서가 결과에 여러 번 나타납니다.
다음 조회는 중복 부서를 제거합니다.
SELECT DISTINCT OBJECT(d) from DeptBean d, IN (d.emps) AS e WHERE e.salary > 50000
다음 조회는 보너스가 연봉의 40%를 초과하는 직원을 찾습니다.
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 )
CMP 필드로서 java.sql.* 데이터 유형을 사용하고 데이터 저장소가 DB2®이면
조회는 DB2 스타일 날짜-시간 산술 연산식을 포함할 수 있습니다. 다음 조회는 2000년 1월 1일 현재 20년 이상 근무한 모든 직원을 찾습니다.
SELECT OBJECT(e) FROM EmpBean e where year( '2000-01-01' - e.hireDate ) >= 20
데이터 저장소가 DB2가 아니거나 CMP 필드로서 java.util.Calendar를
사용하는 것을 선호하는 경우, 조회에서 Java 밀리초 값을 사용할 수 있습니다. 다음 조회는 1990년 1월 1일 이전에 출생한 모든 직원을 찾습니다.
SELECT OBJECT(e) FROM EmpBean e WHERE e.birthDate < 631180800232
다음 조회는 직원이 없는 부서를 찾습니다.
SELECT OBJECT(d) from DeptBean d where d.emps IS EMPTY
다음 조회는 연봉이 Bob보다 많은 모든 직원을 찾습니다.
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)
이전에 나열된 조회 모두 리턴 EJB 오브젝트를 리턴합니다. 파인더 메소드 조회는 항상 홈용 EJB 오브젝트를 리턴합니다. 선택 메소드 조회는 추가로 CMP 필드나 홈에 속하지 않은 다른 EJB 오브젝트를 리턴할 수 있습니다.
다음은 EmpBean에 대한 올바른 선택 메소드 조회입니다. 각 부서의 관리자를 리턴합니다.
SELECT d.mgr FROM DeptBean d
다음 조회는 부서 42의 관리자 이름을 리턴합니다.
SELECT d.mgr.name FROM DeptBean d WHERE d.deptno = 42
다음 조회는 부서 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절에서 단일 CMP 필드 또는 EJBObject만 허용합니다.선택 조회는 SUM, MIN, MAX, AVG와 COUNT를 사용하여 엔터프라이즈 JavaBean
2.1에서 집계인 값을 리턴할 수 있습니다.
SELECT max(e.salary) FROM EmpBean e WHERE e.dept.deptno=42
동적 조회 API는 SELECT절에서 복수 표현식을 허용합니다. 다음 조회는 올바른 동적 조회이지만 올바른 선택 또는 파인더 조회는 아닙니다.
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
동적 조회 API는 Bean 또는 값 오브젝트 메소드를 포함한 조회를 허용합니다.
SELECT object(e), e.address.format( )
FROM EmpBean e EmpBean e