Language/Java

queryDSL 사용방법

hu6r1s 2024. 3. 14. 20:54

Config 설정

queryDSL을 사용하기 위해서 Dependency를 추가해줘야 한다.

implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

 

build.gradle에 해당 스크립트를 추가해준다.

그리고 queryDSL은 JPAQueryFactory를 통해서 사용해야 하기 때문에 빈 등록을 해줘야 한다.

Config 파일을 따로 만들어도 되지만, 나는 JpaConfig 파일이 있기 때문에 거기에 코드를 작성했다.

@Configuration
@EnableJpaAuditing
@RequiredArgsConstructor
public class JpaConfig {

  private final EntityManager entityManager;

  @Bean
  public JPAQueryFactory jpaQueryFactory() {
    return new JPAQueryFactory(entityManager);
  }
}

 

이렇게 entityManager를 넣어주고 나면 JPAQueryFactory를 사용할 수 있게 된다.

사용 방법

사용 방법은 JpaRepository와 비슷하게 사용하면 된다.

@Repository
@RequiredArgsConstructor
public class ApiUseTimeQuery {

  private final JPAQueryFactory query;

  public List<User> getEvent() {
    QUserEntity user = QUserEntity.userEntity;
    QApiUseTime time = QApiUseTime.apiUseTime;
    List<UserEntity> result = query.select(user)
      .from(user)
      .join(time)
      .on(user.userId.eq(time.userId))
      .orderBy(time.totalTime.desc())
      .fetch();
    return result.stream().map(userEntity -> userEntity.toModel()).toList();
  }
}

 

@Repository 어노테이션을 사용해서 빈 객체로 만들어주고 JPAQueryFactory 를 선언하여 사용하면 된다.

queryDSL은 QClass를 생성해주는데 이는 엔티티 클래스의 메타 정보를 담고 있는 클래스이다.

QClass를 통해 테이블로 사용하면 된다.조인과 같은 복잡한 쿼리에 대해서는 queryDSL이나 JPQL이 많이 편한 것 같다.