Develop/JPA

[자바 ORM 표쥰 JPA 프로그래밍] 24일차 - QueryDSL(3)

자라선 2021. 11. 15. 23:46

1. UPDATE, DELETE

UPDATE와 DELETE 를 지원하지만 영속성 컨텍스트를 거치지 않고

바로 DB로 쿼리를 보내버리기 때문에 주의가 필요하다.

QItem item = QItem.item;

// UPDATE 쿼리
JPAUpdateClause updateClause = new JPAUpdateClause(em, item);
long uptCount = updateClause.where(item.name.eq("네임"))
                .set(item.price, item.price.add(100))   // price + 100 시킴
                .execute();

// DELETE 쿼리
JPADeleteClause deleteClause = new JPADeleteClause(em, item);
long delCount = deleteClause.where(item.name.eq("네임")).execute();

 

2. 동적쿼리

JPAQuery query = new JPAQuery(em);
QItem item = QItem.item;

// 동적쿼리용 QueryDSL 라이브러리
BooleanBuilder builder = new BooleanBuilder();

// 이 조건이 참이면
if("네임".equals("네임")){
    builder.and(item.name.contains("네임"));  // like 조건을 추가
}

List<Item> list = query.from(item)
                        .where(builder)
                        .list(item);

 

3. 메소드 위임

조건을 메소드로 정의할 수 있다.

 

public class ItemExpression {

    @QueryDelegate(Item.class)
    public static com.mysema.query.types.expr.BooleanExpression isExpensive(QItem item, Integer price){
        return item.price.gt(price);
    }
}

조건을 정의해줄 객체를 생성 후 @QueryDelegate 어노테이션을 정의하여

어떤 메타모델에 추가할지 파라미터 값으로 넣어준다.

 

static 메소드로 정의해야하며 반환타입은 BooleanExpression 객체(동일한 라이브러리 주의)로 하며 

파라미터는 첫번째 대상 엔티티의 쿼리 타입(Q)로 지정하며 나머지는 조건에 들어갈 파라미터로 추가해준다.

 

/**
 * QItem is a Querydsl query type for Item
 */
@Generated("com.mysema.query.codegen.EntitySerializer")
public class QItem extends EntityPathBase<Item> {

    ....

    public BooleanExpression isExpensive(Integer price){
        return ItemExpression.isExpensive(this, price);
    }

}

메타모델에서 메소드를 추가해준다.

 

        List<Item> list = query.from(item)
                                .where(item.isExpensive(30000))
                                .list(item);

 

추가된 조건도 다른 조건문과 동일하게 사용하면 된다.