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();

 

+ Recent posts