JPA_Chap10-2_객체지향 쿼리 언어

윤일권·2023년 6월 6일
0

JPA

목록 보기
8/11

QueryDSL

  • Criteria의 가장 큰 단점은 너무 복잡하고 어렵다 때문에 코드로 작성해도, 쉽고 간결하며 그 모양도 쿼리와 비슷하게 개발할 수 있는 프로젝트인 QueryDSL을 사용하여 대처한다.

  • QueryDSL을 사용하려면 우선 com.mysema.query.jpa.impl.JPAQuery 객체를 생성해야 하는데 이때 엔티티 매니저를 생성자에 넘겨준다.

  • 쿼리 타입의 기본 인스턴스를 사용하면 import static을 사용하여 간결하게 작성할 수 있다.

결과 조회

  • 결과 조회 메서드
    • uniqueResult() : 조회 결과가 한 건일 때 사용.
    • singleResult() : uniqueResult()와 같지만 결과가 하나 이상이면 처음 데이터 사용.
    • list() : 결과가 하나 이상일 때 사용.

조인

  • inner, left, right, full 조인을 사용할 수 있고, 추가로 JPQL의 on과 성능 최적화를 위한 fetch 조인도 사용할 수 있다.

서브 쿼리

  • 서브쿼리는 com.mysema.query.jpa.JPASubQuery를 생성해서 사용한다.
  • 서브 쿼리의 결과가 하나면 unique(), 여러건이면 list()를 사용한다.

수정, 삭제 배치 쿼리

  • QueryDSL도 수정, 삭제 같은 배치 쿼리를 지원.
  • JPQL 배치 쿼리와 같이 영속성 컨텍스트를 무시하고 데이터베이스를 직접 쿼리한다.

동적 쿼리

  • com.mysema.query.BooleanBuilder를 사용하면 특정 조건에 따른 동적 쿼리를 편리하게 생성 가능.

메소드 위임

  • 쿼리타입에 검색 조건을 직접 정의 가능
  • 정적 메소드를 만들고 @com.mysema.query.annotation.QueryDelegate 어노테이션에 속성으로 이 기능을 적용할 엔티티 지정.

네이티브 SQL

  • 특정 데이터 베이스에 종속적인 기능을 지원하는 방법

    • 특정 데이터베이스만 사용하는 함수
    • 특정 데이터베이스만 지원하는 SQL 쿼리 힌트
    • 인라인 뷰, UNION, INTERSECT
    • 스토어 프로시저
    • 특정 데이터베이스만 지원하는 문법
  • 네이티브 SQL을 사용하면 엔티티를 조회할 수 있고, JPA가 지원하는 영속성 컨텍스트의 기능을 그대로 사용할 수 있다.

  • 네이티브 SQL로 SQL만 직접 사용할 뿐이지 나머지 JPQL을 사용할 때와 같다. 조회한 엔티티도 영속성 컨텍스트에서 관리된다.

  • JPQL처럼 네이티브 SQL도 Named 네이티브 SQL을 사용해서 정적 SQL을 작성할 수 있다.

  • @NamedNativeQuery 속성

객체지향 쿼리 심화

  • 벌크 연산
    • 여러 건을 한 번에 수정하거나 삭제하는 연산.
    • executeUpdate() : 벌크 연산으로 영향을 받는 엔티티 건수를 반환.
    • 주의점 : 벌크 연산이 영속성 컨텍스트를 무시하고 데이터베이스에 직접 쿼리한다.
    • 주의점 해결방안
      • em.refresh() 사용
      • 벌크 연산 먼저 실행
      • 벌크 연산 수행 후 영속성 컨텍스트 초기화
  • 영속성 컨텍스트와 JPQL
    • 쿼리 후 영속 상태인 것과 아닌것
      • JPQL로 엔티티를 조회하면 영속성 컨텍스트에서 관리되지만, 엔티티가 아니면 영속성 컨텍스트에서 관리되지 않는다.
      • 즉, 조회한 엔티티만 영속성 컨텍스트가 관리한다.
    • JPQL로 조회한 엔티티와 영속성 컨테스트
      • JPQL로 조회한 엔티티는 영속상태다.
      • 영속성 컨텍스트에 이미 존재하는 엔티티가 있으면 기존 엔티티를 반환
      • 영속성 컨텍스트는 영속 상태인 엔티티의 동일성을 보장한다.
      • JPQL은 항상 데이터베이스를 조회
      • JPQL로 조회한 엔티티는 영속 상태
      • 영속성 컨텍스트에 이미 존재하는 엔티티가 있으면 기존 엔티티를 반환
  • JPQL과 플러시 모드
    • 플러시는 영속성 컨텍스트의 변경 내역을 데이터베이스에 동기화 하는것.
    • JPA는 플러시가 일어날 대 영속성 컨텍스트에 등록, 수정, 삭제한 엔티티를 찾아서 INSERT, UPDATE, DELETE SQL을 만들어 데이터 베이스에 반영한다.
profile
생각하는 개발자가 되겠습니다!!

0개의 댓글