https://velog.io/@soyeon207/QueryDSL-Spring-Boot-에서-QueryDSL-JPA-사용하기
entity 클래스와 매핑되는 querydsl Q클래스 객체
querydsl은 컴파일 단계에서 엔티티를 기반으로 Q클래스를 생성하는데 JPAAnnotationProcessor가 컴파일 시점에 작동해서 @Entity 어노테이션을 찾아 해당 파일 분석해 QClass 만든다.
QClass는 entity와 형태 똑같은 static class 이다.
querydsl은 쿼리 작성 시 QClass 기반으로 쿼리 실행함.
querydsl과 jparepository 함께 사용하려면 각 역할 별 파일 만들거나 두 개의 의존성 가져야 함.
spring data custrom repository
스프링에서 queryDSL 사용하는 방법 총 3가지 존재.
1. spring data jpa custom repository
2. QueryRepositorySupport
3. JPAQueryFactory
repo랑 repoImpl 두 개 만들어야 함.
repo(인터페이스)가 다중상속 받고, 커스텀 repo 인터페이스 구현은 repoImpl이 함.
사용자는 repo 인터페이스 di 받아서 사용.
그런데 repoImpl은 repo 직접 구현 x, 어떻게 사용할까?
사용자 정의 구현 클래스인 경우 jpa가 파일명이 repo 인터페이스 이름 + impl인 클래스 찾아서
인터페이스에 jpaRepository 인젝션 할 때 impl 객체 삽입해주기 떄문에 사용 가능!
반드시 구현체 이름이 인터페이스 이름 + Impl 이어야 함.
이 경우 총 3개의 repository 관련 파일이 생성됨.
public interface ContentRepository extends JpaRepository<Content, Long>, ContentRepositoryCustom {
}
public interface ContentRepositoryCustom {
}
@RequiredArgsConstructor
public class ContentRepositoryImpl implements ContentRepositoryCustom {
private final JPAQueryFactory queryFactory;
}
@RequiredArgsConstructor
@Repository
public class ContentQueryRepository {
private final JPAQueryFactory queryFactory;
public List<Content> findByTitle(String title) {
return queryFactory
.selectFrom(content)
.where(content.title.eq(title))
.fetch();
}
}