[TIL-Annotation]Querydsl

이용준·2023년 5월 30일
0

TIL

목록 보기
18/21

@Query

  • JPQL을 작성해 데이터 베이스에서 값을 가져오는 방법
    - JPA 구현체에서 자동으로 쿼리문 해석 및 실행
    - DB에 특화된 SQL 작성 가능하며, 주로 튜닝된 쿼리를 사용하고자 할 때 SQL 작성

  • 작성법

@Query("select p from Product p whrer p.name = :name")
List<Product> findByNameParam(@Param("name") String name);
  • 주의

    @Query 어노테이션은 직접 문자열 입력하므로 컴파일 시점의 에러 잡지 못하고 런타임 에러 발생 할 수 있음.


@QueryDSL

  • 정적 타입을 이용해 SQL과 같은 쿼리 생성 가능하도록 지원하는 프레임워크
  • 플루언트(Fluent) API를 활용해 쿼리 생성 가능
  • 작성된 엔티티 클래스 외 Q도메인을 이용해야만 한다.

장점

  1. IDE에서 자동 완성 기능 제공
  2. 문법적으로 잘못된 쿼리 불허
  3. 동적 쿼리 생성 가능
  4. 코드로 작성하므로 가독성 및 생산성 향상
  5. 도메인 타입과 프로퍼티 안전하게 참조 가능

활용

  • build.gradle 추가
    - plugins 항목에 querydsl 관련 부분 추가
    - dependencies 항목에 필요한 라이브러리 추가
    - Gradle에서 사용할 추가적 task 추가
buildscript {  
   ext {  
      queryDslVersion="5.0.0"  
   }  
}

implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"  
  
annotationProcessor(  
      "javax.persistence:javax.persistence-api",  
      "javax.annotation:javax.annotation-api",  
      "com.querydsl:querydsl-apt:${queryDslVersion}:jpa"  
)


sourceSets{   // 저장소 지정
   main{  
      java{  
         srcDirs=["$projectDir/src/main/java", "$projectDir/build/generated/sources/annotationProcessor/java/main/"]  
      }  
   }}  
  
compileJava.dependsOn("clean")
  • Repository에 QuerydslPredicateExecutor 인터페이스 추가 상속
public interface -Repository extends JpaRepository<EN, T>, QuerydslPredicateExecutor<EN>

기본 사용법

  1. BooleanBuilder 생성
  2. 조건에 맞는 구문은 Querydsl에서 사용하는 Predicate 타입의 함수 생성
  3. BooleanBuilder에 작성된 Predicate 추가 및 실행
@Test
public void testQuery(){
	Pageable pageable = PageRequest.of(0,10.Sort.by("params").descending());
	
	QEntity qEntity = QEntity.entity;
	
	String keyword = "keyword";
	
	BooleanBuilder builder = new BooleanBuilder();
	
	BooleanExpression expression = qEntity.title.contains(keyword);
	
	builder.and(qEntity.param.gt(0L));
	
	builder.and(expression);
	
	Page<Entity> result = EntityRepository.findAll(builder, pageable);
	
	result.stream().forEach(entity->{
		System.out.println(entity);
	})
	
}
  1. Q도메인 클래스 얻어오기
    QEntity qEntity = QEntity.entity;
  2. BooleanBuilder - 조건(where) 컨테이너
    BooleanBuilder builder = new BooleanBuilder();
  3. BooleanExpression - 필드 값과 결합한 조건 생성
      BooleanExpression expression = qEntity.title.contains(keywrod);
  4. and * or - 만들어진 조건 결합
    builder.and(expression);
  5. findAll - EntityRepository에 추가된 QuerydslPredicateExcutor 인터페이스의 메서드 사용
    Page<Entity> result = EntityRepository.findAll(builder, pageable);
profile
뚝딱뚝딱

0개의 댓글