Bldev's Blog

스프링

[JPA/스프링] JPQL

2023. 6. 8.

엔티티 매니저 설정

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

  1. JPQL

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

w
```java
public class JpqlService {
public getResult() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("퍼시스턴스유닛명");
EntityManager em = emf.createEntityManager();

        Query query = em.createQuery(쿼리문자열, 엔티티객체.class);
        List<엔티티객체> result = query.getResultList();
      }
    } 
    ```

- 엔티티 매니저 의존성 주입

    ```java
    public class JpqlService {
      @PersistenceContext
      EntityManager em;
      
      public getResult() {
        Query query = em.createQuery(쿼리문자열, 엔티티객체.class);
        List<엔티티객체> result = query.getResultList();
      }
    } 
    ```
  1. 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();
        } 
      }
      
  2. 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클래스(쿼리 타입)를 생성한다.

참고