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);
추가된 조건도 다른 조건문과 동일하게 사용하면 된다.