일반적으로 JPA는 굉장히 편리하지만, 복잡한 쿼리를 날리고 싶을 때는 곤란해진다.
그럴 때는 JPQL 직접 쿼리를 작성할 수 있다.
@Query(쿼리문)
fun 함수명 : 리턴 타입
하지만 이러면 쿼리문이 그냥 문자열 취급 된다는 문제가 있다. (쿼리스트링)
이걸 해결하는 게 QueryDSL
근데 Open Feign QueryDSL 써야함. (사유: 기존거 업데이트 끊김)
플러그인에 추가 :
kotlin("kapt") version "1.9.25"
dependencies에 추가:
implementation("io.github.openfeign.querydsl:querydsl-jpa:7.1")
kapt("io.github.openfeign.querydsl:querydsl-apt:7.1:jpa")
@Configuration
class JpaConfig(private val entityManager : EntityManager) {
@Bean
fun jpaQueryFactory():JPAQueryFactory{
return JPAQueryFactory(entityManager)
}
}
1) RepositoryCustom 인터페이스를 만든다
2) ReposityImpl 클래스를 만들어서 상속 받는다. (꼭 Impl 붙여야 함)
3) 기존의 Repository에 RepositoryCustom 상속 받게 함
4) ReposityImpl도 RepositoryCustom 상속 받게 함
-> Repository(인터페이스), RepositoryCustom(인터페이스), RepositoryImpl(클래스) 파일 이렇게 3개 있는 거임
그럼 이제 함 써보자.
일단 RepositoryCustom 파일에 함수를 선언한다.
interface UserRepositoryCustom {
fun a(): User?
}
그 다음에 RepositoryImpl에서 구현해주면 끝
class UserReposityImpl : UserRepositoryCustom {
override fun a(): User? {
구현 내용
}
}
쿼리는 이렇게 쓴다
val user= QUser.user
return jpaQuery
.select(user)
.from(user)
.where(user.id.eq(id))
.fetchOne()
이건 select * from user where user.id=id limit 1 임.
+) 여러개 가져올거면 그냥 fetch() 함 됨
+) val user= QUser.user 이건 아래에 있는 select와 from에 넣어주려고 쓴다. -> 필요한 엔티티를 QueryDSL에서 참조하기 위한 객체 불러오는 거
그리고 QUser는 개발자가 작성한 엔티티 보고 자동으로 만들어준다.
build -> generated -> source -> kapt 들어가면 파일 구조 뜨는 데 거기서 찾을 수 있다.
엥 저는 제 엔티티랑좀 달라요 하면
클릭 해서 gradle 열고 Tasks -> other -> compilKotlin
그리고 딴 소리인데 jpa 써도 jpql 쓰고, 그걸 sql로 변환하는 거임