// Order.java
@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
private List<OrderItem> orderItems = new ArrayList<>();
이 경우는 파라미터 값이 다 존재한다는 뜻
그런데 status, name의 값이 null일 수 있다.
-> 이 방법은 안쓸거다.// OrderRepository.java public List<Order> findAll(OrderSearch orderSearch) { List<Order> resultList = em.createQuery("select o from Order o join o.member m " + "where o.status = :status " + "and m.name like :name",Order.class) .setParameter("status", orderSearch.getOrderStatus()) .setParameter("name", orderSearch.getMemberName()) .setFirstResult(100) .setMaxResults(10) .getResultList(); return resultList; }
-> 따라서 우린 QueryDSL을 쓸거다.
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
//annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
//querydsl 추가
def querydslDir = "$buildDir/generated/querydsl"
sourceSets {
main.java.srcDirs += [ querydslDir ]
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslDir)
}
clean.doLast {
file(querydslDir).deleteDir()
}
이걸 추가해준다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.4'
id 'io.spring.dependency-management' version '1.1.3'
}
group = 'com.codingbox'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-validation'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.oracle.database.jdbc:ojdbc8'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
//annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}
tasks.named('test') {
useJUnitPlatform()
}
//querydsl 추가
def querydslDir = "$buildDir/generated/querydsl"
sourceSets {
main.java.srcDirs += [ querydslDir ]
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslDir)
}
clean.doLast {
file(querydslDir).deleteDir()
}
이렇게 된다.
Window -> Show View -> Other
Gradle Task
Run Default Gradle Task 실행
clean 한번 해주고 기다리면 Gradle Task에 나타난다.
Gradle Task에 이렇게 나타난다.
Gradle refresh
좀 기다린 뒤에 프로젝트 clean, refresh 해주면
이렇게 QClass가 생긴다.
-> QClass는 git에 업로드 하면 안된다.
// QueryDSL - 실무에서 많이 사용
public List<Order> findAll(OrderSearch orderSearch){
JPAQueryFactory query = new JPAQueryFactory(em);
// Order, Member 간에 join을 해야한다.
QOrder order = QOrder.order;
QMember member = QMember.member;
return query.select(order)
.from(order)
.join(order.member, member) // member : member의 알리아스
.where(order.status.eq(orderSearch.getOrderStatus()),
member.name.like(orderSearch.getMemberName()))
.fetch();
}
// Order.java
// 주문 취소
public void cancel() {
this.setStatus(OrderStatus.CANCEL);
for( OrderItem orderItem : orderItems ) {
orderItem.cancel();
}
}
// OrderItem.java
public void cancel() {
getItem().addStock(count);
}
// Item.java
// stock 증가
public void addStock(int count) {
this.stockQuantity += count;
}