728x90
Querydsl 설정
Querydsl SpringBoot 2.7 build.gradle
QueryDsl SpringBoot 2.7의 gradle 설정을 공유합니다. - 인프런 | 고민있어요
plugins { id 'org.springframework.boot' version '2.7.4' id 'io.spring.dependency-management' version '1.0.14.RELEASE' id 'java' } group = 'study' ve...
www.inflearn.com
Querydsl SpringBoot 3.0 build.gradle
QueryDsl SpringBoot 3.0의 gradle 설정을 공유합니다. - 인프런 | 고민있어요
최근 스프링부트 3.0이 나옴에 따라 QueryDSL 설정 내용을 공유합니다.아래 설정 내용중 Querydsl 추가 라고 나온 부분만 추가하시면 됩니다.스프링 부트: 3.0.0, 자바: 17 기준입니다!plugins { id 'java' id 'o
www.inflearn.com
적용
JpaItemRepository
@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);
}
@Override
public Item save(Item item) {
em.persist(item);
return item;
}
@Override
public void update(Long itemId, ItemUpdateDto updateParam) {
Item findItem = findById(itemId).orElseThrow();
findItem.setItemName(updateParam.getItemName());
findItem.setPrice(updateParam.getPrice());
findItem.setQuantity(updateParam.getQuantity());
}
@Override
public Optional<Item> findById(Long id) {
Item item = em.find(Item.class, id);
return Optional.ofNullable(item);
}
public List<Item> findAllOld(ItemSearchCond itemSearch) {
String itemName = itemSearch.getItemName();
Integer maxPrice = itemSearch.getMaxPrice();
QItem item = QItem.item;
BooleanBuilder builder = new BooleanBuilder();
if (StringUtils.hasText(itemName)) {
builder.and(item.itemName.like("%" + itemName + "%"));
}
if (maxPrice != null) {
builder.and(item.price.loe(maxPrice));
}
List<Item> result = query
.select(item)
.from(item)
.where(builder)
.fetch();
return result;
}
@Override
public List<Item> findAll(ItemSearchCond cond) {
String itemName = cond.getItemName();
Integer maxPrice = cond.getMaxPrice();
List<Item> result = query
.select(item)
.from(item)
.where(likeItemName(itemName), maxPrice(maxPrice))
.fetch();
return result;
}
private BooleanExpression likeItemName(String itemName) {
if (StringUtils.hasText(itemName)) {
return item.itemName.like("%" + itemName + "%");
}
return null;
}
private BooleanExpression maxPrice(Integer maxPrice) {
if (maxPrice != null) {
return item.price.loe(maxPrice);
}
return null;
}
}
- Querydsl을 사용하려면 JPAQueryFactory 가 필요하다.
- JPAQueryFactory 는 JPA 쿼리인 JPQL을 만들기 때문에 EntityManager 가 필요하다.
findAll()
- Querydsl에서 where(A,B) 에 다양한 조건들을 직접 넣을 수 있는데, 이렇게 넣으면 AND 조건으로 처리된다.
- where() 에 null 을 입력하면 해당 조건은 무시한다.
-
likeItemName() , maxPrice() 쿼리 조건을 부분적으로 모듈화 할 수 있다. 자바 코드로 개발하기 때문에 얻을 수 있는 큰 장점이다.
※ 정리
List<Item> result = query
.select(item)
.from(item)
.where(likeItemName(itemName), maxPrice(maxPrice))
.fetch();
- 쿼리 문장에 오타가 있어도 컴파일 시점에 오류를 막을 수 있다.
- 메서드 추출을 통해서 코드를 재사용할 수 있다.
반응형
'Spring > DB 2편' 카테고리의 다른 글
스프링 트랜잭션 이해 (0) | 2023.08.11 |
---|---|
데이터 접근 기술 - 활용 방안 (0) | 2023.08.11 |
데이터 접근 기술 - 스프링 데이터 JPA (0) | 2023.08.11 |
데이터 접근 기술 - JPA (0) | 2023.08.10 |
데이터 접근 기술 - MyBatis (0) | 2023.08.10 |