JAVA

Sql In, Not In 절 (JDBC JPA) QueryDsl 활용

fouink 2023. 1. 17. 11:47

where 문의 or 대신 in을 활용하려 한다.

이유는 or는 인덱스 활용 불가능이고 in은 인덱스를 활용할 수 있어 in 절이 속도 면에서 우위가 있다.

 

- sql in 절의 특징

sql in ( “1”,”2”) 의 경우는 내부 콤마가 or가 되고.

sql Not In (“1”, “2”)의 경우는 내부 콤마가 and가 된다.

 

- Query dsl 특징

where(000, 000) 의 경우는 내부 콤마가 and가 된다

 

- 실제 동적쿼리 적용 코드

    @Override
    public List<Gift> findByReceiverIdAndStatusOrStatus(String receiverId, AcceptStatus... acceptStatuses) {
        List<Gift> kdKDGifts = queryFactory
                .select(gift)
                .from(gift)
                .join(gift.giftProduct, giftProduct)
                .orderBy(gift.sendDt.desc())
                .where(gift.receiverId.eq(receiverId), gift.status.in(acceptStatuses))
//                .where(gift.receiverId.eq(receiverId).and(statusEqOr(acceptStatuses)))
                .fetch();
        return kdKDGifts;
    }

 

@Override
public List<Order> findByOrderNosOrderStatusNotEqCancel(Set<String> orderNos) {

    List<Order> orders = queryFactory
            .select(order)
            .from(order)
            .where(order.orderNo.in(orderNos), order.orderStatusType.notIn("RETURN_DONE", "CANCEL_DONE"))
            .fetch();

    return orders;
}

 

 

 

실제 쿼리에서도 볼 수 있다시피 where절에 and가 생겼다

 

결과에서도 in절의 특징들 대로 원하는 값을 도출할 수 있었다.

 

동적쿼리 작성 시 querydsl은 굉장히 사용하기 좋은 것 같다.