SpringBoot
[SpringBoot] QueryDsl Gradle 설정하기
Xmobile
2020. 10. 13. 09:49
JPA는 기본적으로 테이블의 CRUD 메소드를 제공해주기 때문에 SQL문을 직접 사용할 필요가 없습니다.
그러나 여러 테이블의 데이터를 조합하기 위해서 불필요한 데이터를 가져올 수 밖에 없는데 이러한 점을 해결하기 위해 JPQL (Java Persistence Query Language) 라는 쿼리 언어를 사용하고
QueryDsl은 JPQL의 빌더 역할을 하는 오픈소스입니다.
gradle 설정
plugins {
id 'org.springframework.boot' version '2.3.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
…
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
//log
annotationProcessor 'org.projectlombok:lombok'
compileOnly 'org.projectlombok:lombok'
//querydsl
compile("com.querydsl:querydsl-jpa") // querydsl
compile("com.querydsl:querydsl-apt") // querydsl
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
//db
compile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.4.1'
compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
}
//querydsl
def querydslSrcDir = 'src/main/generated'
querydsl {
library = "com.querydsl:querydsl-apt"
jpa = true
querydslSourcesDir = querydslSrcDir
}
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
configurations {
querydsl.extendsFrom compileClasspath
}
sourceSets {
main {
java {
srcDirs = ['src/main/java', querydslSrcDir]
}
}
}
//querydsl
사용하기
1. Entity클래스 만들기
@Entity
@Table(name="lo_mst")
@Getter
@Setter
public class EntityMst{
@Id
@Column(name = "id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@Column(name = "_order")
private int _order;
@Column(name = "num1")
private int num1;
@Column(name = "num2")
private int num2;
@Column(name = "num3")
private int num3;
@Column(name = "num4")
private int num4;
@Column(name = "num5")
private int num5;
@Column(name = "num6")
private int num6;
@Column(name = "num7")
private int num7;
@Column(name = "win_date")
private String winDate;
@Column(name = "reg_dt")
private LocalDateTime regDt;
}
Entity클래스를 생성 후 빌드를 하게되면 gradle에서 설정한 generated폴더에 클래스가 생성하게 됩니다.
2. QueryDsl 사용
아래와 같이 생성된 클래스, 변수에 접근하여 쿼리를 작성할 수 있습니다.
MainDto.LottoInfo result = queryFactory.select(Projections.bean(MainDto.LottoInfo.class
, ExpressionUtils.as(
JPAExpressions.select(entityMst._order.max())
.from(entityMst), "lastOrder")
,entityMst._order
,entityMst.num1
,entityMst.num2
,entityMst.num3
,entityMst.num4
,entityMst.num5
,entityMst.num6
,entityMst.num7
,entityMst.winDate
,entityMstEtc.etc
,entityMstEtc.totalSalesPrc
,entityMstEtc.payLimit
))
.from(entityMst)
.innerJoin(entityMstEtc)
.on(entityMst._order.eq(entityMstEtc._order))
.where(builder)
.orderBy(entityMst._order.desc())
.fetchFirst();