[JPA/스프링] JPQL
엔티티 매니저 설정
객체지향 쿼리의 종류에는 JPQL, Criteria, QueryDSL가 있다. 엔티티 매니저를 설정하는 코드는 다음과 같다.
-
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(); } }
- 엔티티 매니저 팩토리 사용
w
-
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(); } }
-
-
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과 함께 사용하는 경우 다음 두 방법으로 엔티티 매니저를 설정할 수 있다.
-
JpaRepository
-
QueryDslRepositorySupport
상속-
QueryDslRepositorySupport
의setEntityManager()
메서드를 사용하여 엔티티 매니저 주입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 프로젝트 설정
- 빌드 의존성 설정
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