쿼리를 Java로 type-safe하게 개발할 수 있게 지원해주는 프레임워크
String sql = "select * from item wherename like ?"
// dependency
//Querydsl 추가
implementation 'com.querydsl:querydsl-jpa'
annotationProcessor "com.querydsl:querydsl-apt:$
{dependencyManagement.importedProperties['querydsl.version']}:jpa"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
// 이 코드를 추가하면 gradle clean을 실행할 때 src/main/generated 파일도 삭제해준다
// 이건 dependencies 바깥에 붙여주자
clean {
delete file('src/main/generated')
}
이 두개의 코드를 추가해주자
Gradle방법 : Gradle을 통해서 빌드
Gradle IntelliJ 사용법
Gradle -> Tasks -> build -> clean
Gradle -> Tasks -> other -> compileJava
Gradle 콘솔 사용법
./gradlew clean compileJava
build -> generated -> sources -> annotationProcessor -> java/main
여기에 Q타입이 생성되면 완료!
IntelliJ IDEA방법 : intelliJ가 직접 자바를 실행해서 빌드
@Repository
@Transactional
public class JpaItemRepositoryV3 implements ItemRepository {
private final EntityManager em;
private final JPAQueryFactory query;
public JpaItemRepositoryV3(EntityManager em) {
this.em = em;
this.query = new JPAQueryFactory(em);
}
// Querydsl 적용 전
@Override
public List<Item> findAll(ItemSearchCond cond) {
String itemName = cond.getItemName();
Integer maxPrice = cond.getMaxPrice();
if (StringUtils.hasText(itemName) && maxPrice != null) {
// return repository.findByItemNameLikeAndPriceLessThanEqual("%" + itemName + "%", maxPrice);
return repository.findItems("%" + itemName + "%", maxPrice);
} else if (StringUtils.hasText(itemName)) {
return repository.findByItemNameLike("%" + itemName + "%");
} else if (maxPrice != null) {
return repository.findByPriceLessThanEqual(maxPrice);
} else {
return repository.findAll();
}
}
// Querydsl 적용 후
// 모든 Item 찾기 또는 조건에 따라 찾기
@Override
public List<Item> findAll(ItemSearchCond cond) {
String itemName = cond.getItemName();
Integer maxPrice = cond.getMaxPrice();
QItem item = QItem.item;
return query
.select(item)
.from(item)
.where(likeItemName(itemName), maxPrice(maxPrice))
.fetch();
}
private BooleanExpression likeItemName(String itemName) {
if(StringUtils.hasText(itemName)){
return QItem.item.itemName.like("%" + itemName + "%");
}
return null;
}
private BooleanExpression maxPrice(Integer maxPrice) {
if (maxPrice != null) {
return QItem.item.price.loe(maxPrice);
}
return null;
}
}
새로 하는 프로젝트에서 JPA Querydsl을 사용할 일이 생겨서 급하게 진도를 바꿔 먼저 수강하였다. 내일부터 다시 차근차근 진도 나가야겠다.