카테고리 없음

[QueryDsl] 처음 설정

보동이용용 2025. 2. 25. 17:32
반응형

이클립스, 스프링부트 2.7, 그래들

project 우클릭 > properties > Java Compiler > Annotation Processing

체크 Enable project specific settings
체크 Enable annotation processing
Generated source directory : build/generated 혹은 target/generated

//build.gradle

plugins {
	id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

dependencies {
	// queryDsl 
	implementation "com.querydsl:querydsl-jpa:5.0.0"  // QueryDSL JPA 의존성
    implementation "com.querydsl:querydsl-apt:5.0.0"  // QueryDSL APT 의존성 (Annotation Processor)
}

// querydsl 설정---------
def querydslDir =  "build/generated/sources/annotationProcessor/main"

querydsl {
    jpa = true
    querydslDefault = true
    querydslSourcesDir = querydslDir
}

sourceSets {
	main { 
		java {
			srcDirs = ['src/main/java', querydslDir] 
		}
	}
}

compileQuerydsl {
   options.annotationProcessorPath = configurations.querydsl
}
// querydsl 설정 끝---------

인텔리제이 쓸 경우 설정이 다름. 이것은 이클립스 버전...


Q클래스가 생성되면 쿼리를 작성할 수 있다.
1. 쿼리를 작성할 때 selectfrom을 사용하면 기본 dto에 담을 수 있음
2. select.from....으로 작성하면 dto에 담기위한 추가 작업이 필요함(서브쿼리를 써야해서 따로 사용하는 경우였음)
 1) stream().map().collect() 사용법 

List<Member> members = queryFactory
    .select(qMember)
    .from(qMember)
    .fetch()
    .stream()
    .map(tuple -> tuple.get(qMember))  // Tuple에서 Member 엔티티 추출
    .collect(Collectors.toList());

2) QueryDsl이 제공하는 projection.field 사용법

//Proejctions.fields로 select절을 감싼다.
List<MemberDTO> members = queryFactory
    .select(Projections.fields(MemberDTO.class,
        qMember.id,
        qMember.name,
        qMember.email
    ))
    .from(qMember)
    .fetch();

3. 장단점 비교

 

반응형