Miracle Morning, LHWN

5. 객체지향 쿼리언어_2 본문

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

출처 : fastcampus.co.kr/courses/204729/clips/

'IT 기술 > [JAVA] Spring Boot' 카테고리의 다른 글

7. 트랜잭션  (0) 2021.05.07
6. Spring Data JPA  (0) 2021.05.06
4. 객체지향 쿼리언어_1  (0) 2021.05.06
3. 프록시와 연관관계  (0) 2021.05.05
2. 연관관계매핑  (0) 2021.05.05
Comments