[JPA/스프링] JPQL

엔티티 매니저 설정

객체지향 쿼리의 종류에는 JPQL, Criteria, QueryDSL가 있다. 엔티티 매니저를 설정하는 코드는 다음과 같다.

  1. JPQL

    • 엔티티 매니저 팩토리 사용 w
        public class JpqlService {
          public getResult() {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("퍼시스턴스유닛명");
            EntityManager em = emf.createEntityManager();
                  
            Query query = em.createQuery(쿼리문자열, 엔티티객체.class);
            List<엔티티객체> result = query.getResultList();
          }
        } 
      
    • 엔티티 매니저 의존성 주입

        public class JpqlService {
          @PersistenceContext
          EntityManager em;
                
          public getResult() {
            Query query = em.createQuery(쿼리문자열, 엔티티객체.class);
            List<엔티티객체> result = query.getResultList();
          }
        } 
      
  2. Criteria

    • 엔티티 매니저 팩토리 사용

        public class CriteriaService {
          public getResult() {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("퍼시스턴스유닛명");
            EntityManager em = emf.createEntityManager();
                  
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<엔티티객체> query = cb.createQuery(엔티티객체.class);
            Root<엔티티객체> m = query.from(엔티티객체.class);
            CriteriaQuery<엔티티객체> cq = query.select(m).where();
            List<엔티티객체> resultList =
            em.createQuery(cq).getResultList();
          } 
        }
      
    • 엔티티 매니저 의존성 주입

        public class CriteriaService {
          @PersistenceContext
          EntityManager em;
                
          public getResult() {
            CriteriaBuilder cb = em.getCriteriaBuilder();
            CriteriaQuery<엔티티객체> query = cb.createQuery(엔티티객체.class);
            Root<엔티티객체> m = query.from(엔티티객체.class);
            CriteriaQuery<엔티티객체> cq = query.select(m).where();
            List<엔티티객체> resultList =
            em.createQuery(cq).getResultList();
          } 
        }
      
  3. QueryDSL

    • 엔티티 매니저 팩토리 사용

        public class QueryDslService {
          @PersistenceContext
          EntityManager em;
                
          public getResult() {
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("퍼시스턴스유닛명");
            EntityManager em = emf.createEntityManager();
                  
            JPAQuery query = new JPAQuery(em);
            Q엔티티객체 entity = Q엔티티객체.엔티티객체;
            List<Member> members = query.from(entity)
              .where()
              .list(entity);
          }
        }
      
    • 엔티티 매니저 의존성 주입

        public class QueryDslService {
          @PersistenceContext
          EntityManager em;
                
          public getResult() {
            JPAQuery query = new JPAQuery(em);
            Q엔티티객체 entity = Q엔티티객체.엔티티객체;
            List<Member> members = query.from(entity)
              .where()
              .list(entity);
          }
        }
      


스프링 데이터 JPA를 QueryDSL과 함께 사용하는 경우 다음 두 방법으로 엔티티 매니저를 설정할 수 있다.

  1. JpaRepository

  2. QueryDslRepositorySupport 상속

    • QueryDslRepositorySupportsetEntityManager() 메서드를 사용하여 엔티티 매니저 주입

        class MyEntityRepositoryImpl extends QueryDslRepositorySupport implements CustomMyEntityRepository {
          public MyEntityRepositoryImpl() {
            super(MyEntity.class);
          }
                
          @Override
          @PersistenceContext
          public void setEntityManager(EntityManager entityManager) {
            super.setEntityManager(entityManager);
          }
                
          @Override
          public List<MyEntity> search() {
            Q엔티티객체 entity = Q엔티티객체.엔티티객체;
            JPQLQuery query = from(entity)
              .where()
              .list(entity);
          }
        }
      


참고

  • QueryDSL 5.0.0 버전부터 JPQLQuery 대신 JPAQuery를 사용해야 한다. JPQLQuery의 쿼리 실행 메서드 사용 시 UnsupportedOperationExeception이 발생할 수 있다.


Spring Data JPA + QueryDSL 프로젝트 설정

  1. 빌드 의존성 설정
     dependencies {
         implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
            
         annotationProcessor "javax.persistence:javax.persistence-api"
         annotationProcessor "javax.annotation:javax.annotation-api"
            
         // QueryDSL
         implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
         annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jpa""
     }
    
    • com.querydsl:querydsl-jpa 의존성: JPA 애플리케이션에서 QueryDSL을 사용하기 위한 라이브러리(JPAQuery, JPQLQuery 등)를 제공한다.
    • javax.persistence:javax.persistence-api 어노테이션 프로세서: JPA를 위한 어노테이션(@Entity, @Id, @Column 등)을 제공한다.
    • com.querydsl:querydsl-apt 어노테이션 프로세서: JPAAnnotationProcessor를 사용하여 @Entity 어노테이션을 선언한 클래스를 탐색하고 Q클래스(쿼리 타입)를 생성한다.


참고

Comments