연산자 함수
SQL은 각 데이터베이스에서 제공하는 연산자나 함수가 조금씩 다르다는 것때문에 쿼리 문을 공유할 수 없다
그러나 JPQL에서는 특정 데이터베이스에 종속되지 않는 연산자와 함수를 지원하기에 여러 데이터베이스에서 사용이 가능하다
또한 JPA에서는 엔터티를 사용해서 데이터를 저장하고 있기에 컬렉션을 사용하여 값이 존재하는지 아닌지 empty, member 연산자로 할 수 있다
- is empty 연산자
실행 코드
String jpql = "SELECT d FROM Department d " +
"WHERE d.employeeList is empty";
TypedQuery<Department> query = em.createQuery(jpql, Department.class);
List<Department> resultList = query.getResultList();
System.out.println("직원이 없는 부서 목록");
for (Department department : resultList) {
System.out.println(department.getName());
}
결과
Hibernate:
select
department0_.DEPT_ID as dept_id1_0_,
department0_.name as name2_0_
from
S_DEPT department0_
where
not (exists (select
employeeli1_.id
from
S_EMP employeeli1_
where
department0_.DEPT_ID=employeeli1_.DEPT_ID))
직원이 없는 부서 목록
인재개발부
JPQL 의 쿼리문에서는 exists를 사용하지 않았지만 empty 연산자를 사용해서 부서가 존재 하는지를 조건을 걸었으므로, 이 조건을 수행하기 위해 JPA에서 자동으로 서브쿼리를 사용해 조건에 맞는 데이터를 검색한다
- member of
실행 코드
String jpql = "SELECT d FROM Department d " +
"WHERE :employee member of d.employeeList";
TypedQuery<Department> query = em.createQuery(jpql, Department.class);
// 6번 직원 객체를 검색하여 파라미터로 설정한다.
EmployeeJoin findEmp = em.find(EmployeeJoin.class, 6L);
query.setParameter("employee", findEmp);
List<Department> resultList = query.getResultList();
System.out.println(findEmp.getId() + "번 직원이 소속되어있는 부서 목록");
for (Department department : resultList) {
System.out.println(department.getName());
}
결과
Hibernate:
select
employeejo0_.id as id1_1_0_,
employeejo0_.COMMISSION_PCT as commissi2_1_0_,
employeejo0_.DEPT_ID as dept_id9_1_0_,
employeejo0_.DEPT_NAME as dept_nam3_1_0_,
employeejo0_.MAIL_ID as mail_id4_1_0_,
employeejo0_.name as name5_1_0_,
employeejo0_.salary as salary6_1_0_,
employeejo0_.START_DATE as start_da7_1_0_,
employeejo0_.title as title8_1_0_,
department1_.DEPT_ID as dept_id1_0_1_,
department1_.name as name2_0_1_
from
S_EMP employeejo0_
left outer join
S_DEPT department1_
on employeejo0_.DEPT_ID=department1_.DEPT_ID
where
employeejo0_.id=?
Hibernate:
select
department0_.DEPT_ID as dept_id1_0_,
department0_.name as name2_0_
from
S_DEPT department0_
where
? in (
select
employeeli1_.id
from
S_EMP employeeli1_
where
department0_.DEPT_ID=employeeli1_.DEPT_ID
)
6번 직원이 소속되어있는 부서 목록
영업부
함수 사용하기
종류
- 문자형
- 숫자형
- 날짜형
'BackEnd' 카테고리의 다른 글
[JPA] Spring과 JPA-2 (0) | 2024.07.30 |
---|---|
[JPA] Spring과 JPA-1 (0) | 2024.07.29 |
[JPA] groupping과 subquery (0) | 2024.07.24 |
[JPA] JPQL (0) | 2024.07.22 |
[JPA] 연관관계 매핑( 다대다) (0) | 2024.07.18 |