코딩과 결혼합니다

[JPA] Join 문법 본문

2세/JPA

[JPA] Join 문법

코딩러버 2024. 3. 8. 17:25
728x90

JOIN

데이터베이스에서 여러 테이블을 연결하여 관련된 데이터를 함께 가져오는데 사용된다.

 

JOIN 절은 크게 INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN 으로 나눌 수 있다.

 

INNER JOIN

String jpql = "SELECT e FROM Employee e INNER JOIN e.department d WHERE d.name = 'IT'";
TypedQuery<Employee> query = entityManager.createQuery(jpql, Employee.class);
List<Employee> resultList = query.getResultList();

"Employee" 엔티티와 "Department" 엔티티를 이너조인하여 부서 이름이 'IT'인 직원들을 가져오기

 

이너 조인은 연결된 엔티티 간의 공통된 값을 기준으로 매칭되는 결과를 반환한다. 이너조인을 사용하면 연결된 엔티티 중에서 매칭되는 결과만 가져올 수 있다.

 

LEFT JOIN

String jpql = "SELECT c FROM Customer c LEFT JOIN c.orders o WHERE o.totalAmount > 1000";
TypedQuery<Customer> query = entityManager.createQuery(jpql, Customer.class);
List<Customer> resultList = query.getResultList();

"Customer" 엔티티와 "Order" 엔티티를 레프트 조인하여 주문 금액이 1000보다 큰 고객을 가져오기.

모든 고객 정보와 주문 정보가 함께 반환되며, 주문 정보가 없는 고객은 NULL 값을 가진다.

 

왼쪽(기준) 엔티티를 기준으로 오른쪽 엔티티를 연결한다. 기준 엔티티의 모든 레코드와 매칭되는 오른쪽 엔티티의 레코드를 가져올 수 있다. 오른쪽 엔티티에 매칭되는 값이 없으면 NULL 값을 가진다.

 

RIGHT JOIN

String jpql = "SELECT d FROM Department d RIGHT JOIN d.employees e WHERE e.salary > 5000";
TypedQuery<Department> query = entityManager.createQuery(jpql, Department.class);
List<Department> resultList = query.getResultList();

"Department" 엔티티와 "Employee" 엔티티를 라이트 조인하여 급여가 5000보다 큰 직원들이 속한 부서를 가져오기.

모든 부서 정보와 직원 정보가 함께 반환되며, 직원 정보가 없는 부서는 NULL 값을 가진다.

 

왼쪽(기준) 엔티티와 오른쪽 엔티티를 연결하는데, 라이트 조인을 사용하면 오른쪽 엔티티의 모든 레코드와 매칭되는 왼쪽 엔티티의 레코드를 가져올 수 있다. 왼쪽 엔티티에 매칭되는 값이 없으면 NULL 값을 가진다.

 

FULL JOIN

String jpql = "SELECT p FROM Product p LEFT JOIN p.reviews r WHERE r.rating > 4.5 UNION SELECT p FROM Product p RIGHT JOIN p.reviews r WHERE r.rating > 4.5";
TypedQuery<Product> query = entityManager.createQuery(jpql, Product.class);
List<Product> resultList = query.getResultList();

JPQL은 공식적으로 FULL JOIN을 지원하지 않는다. 하지만 LEFT JOIN과 RIGHT JOIN을 결합하여 유사한 동작을 구현할 수 있다.

 

"Product" 엔티티와 "Review" 엔티티를 LEFT JOIN과 RIGHT JOIN을 결합하여 평점이 4.5보다 높은 제품들과 해당 제품의 리뷰 정보를 가져오기.

 

왼쪽과 오른쪽 엔티티 간의 모든 레코드를 연결한다. 풀 조인을 사용하면 양쪽 엔티티의 모든 레코드를 가져올 수 있다. 매칭되는 값이 없는 경우에도 NULL 값을 가진다.