IT 기술/[JAVA] Spring Boot
5. 객체지향 쿼리언어_2
Lee Hye Won
2021. 5. 6. 08:13
# INNER JOIN
String query = "SELECT" +
"NEW com.jpapeeknapply.service.UserAndGroupDto(user.name, group.name)" +
"FROM User user INNER JOIN user.userGroup group";
List<UserAndGroupDto> userAndGroupDtoList = em.createQuery(query, UserAndGroupDto.class).getResultList();
String query = "SELECT user, group" +
"FROM User user INNER JOIN user.userGroup group";
# OUTER JOIN
String query = "SELECT" +
"NEW com.jpapeeknapply.service.UserAndGroupDto(user.name, group.name)" +
"FROM User user LEFT [OUTER] JOIN user.userGroup group";
※ [] 는 생략가능
# FETCH JOIN
JPQL 의 성능 최적화를 위한 기능으로, 연관된 엔티티나 컬렉션을 한번에 조회하는 기능이다.
- 엔티티 페치 조인 : 엔티티를 조회하며 연관된 엔티티를 함께 조회해온다.
SELECT user from User user join fetch user.userGroup
- 컬렉션 페치 조인 : 엔티티를 조회하며 연관된 엔티티를 함께 조회해온다.
SELECT group from UserGroup group join fetch group.userList
- 페치 조인을 사용하면 준영속 상태에서도 객체 그래프를 탐색할 수 있다.
- 페치 조인 대상에는 별칭을 줄 수 없다. → SELECT, WHERE, 서브 쿼리에서는 페치 조인 대상을 사용할 수 없다.
- 둘 이상의 컬렉션을 패치할 수 없다.
- 페치 조인 사용 시 페이징을 사용할 수 없다.
다만, JPQL 에서도 서브쿼리, 서브쿼리함수, 조건식, 연산자 스칼라식, 함수 등을 지원하기 때문에 필요할 때마다 검색해서 사용하면 된다.
네임드 쿼리 (=정적 쿼리) 도 사용 가능하다.
- COUNT, MAX, MIN, AVG, SUM
- GROUP BY, HAVING
- ORDER BY [ASC(default), DESC]
- JOIN
- INNER
- OUTER
- ON
- FETCH
- SUB QUERY
- Named 쿼리 (= 정적 쿼리)
# 네이티브 SQL
JPQL 에서 지원하는 SQL 을 직접 사용하는 기능
String sql = "SELECT ID, NAME FROM USER WHERE NAME = `kim`"
List<User> userList = em.createNativeQuery(sql, User.class).getResultList();
JDBC 를 직접 사용하거나 MyBatis 같은 매퍼 프레임워크도 사용 가능하다.
다만, 영속성 컨텍스트가 인지하지 못하는 이슈가 발생할 수 있다.
- 특정 DB 에서만 사용하는 함수
- 특정 DB 에서만 지원하는 SQL 쿼리 힌트
- 인라인뷰 (From 절에서 사용하는 서브 쿼리), UNION, INTERSECT
- 결과 매핑 어노테이션
- @SqlResultSetMapping
- @EntityResult
- @FieldResult
- @ColumnResult
- Named 네이티브 SQL