jpa

LatteJava·2024년 4월 4일
where
m.email = ?1 and m.name = ?2

SELECT CASE WHEN COUNT(*) > 0 THEN TRUE ELSE FALSE END
FROM like
WHERE user_id = :userId AND post_id = :postId;

findByCreatedAtAfterAndPriceLessThanOrderByPriceDescItemIdDesc

LessThanEqual <=

is와 like의 차이

ignoreCase : 대소문자 구분없이

벌크성 쿼리

파라미터로 인터페이스를 받은 경우
-> 사용시 객체를 구현해야한다.

QueryDSL

@Override
    public List<Item> findNewItemsOrderBy(Long lastIdx, Long lastItemId, ItemSortType sortType,
        Pageable pageable)
  1. OrderSpecifier
OrderSpecifier orderSpecifier = createOrderSpecifier(sortType);
 private OrderSpecifier createOrderSpecifier(ItemSortType sortType) {

        return switch (sortType) {
            case NEW -> new OrderSpecifier<>(Order.DESC, item.itemId);
            case HIGHEST_AMOUNT -> new OrderSpecifier<>(Order.DESC, item.price);
            case LOWEST_AMOUNT -> new OrderSpecifier<>(Order.ASC, item.price);
            case DISCOUNT -> new OrderSpecifier<>(Order.DESC, item.discount);
            default -> new OrderSpecifier<>(Order.DESC, item.orderItems.any().quantity.sum());
        };
    }
  1. Predicate
// 참조는 기준이 될 수 있다.
// 
Predicate predicate = item.createdAt.after(LocalDateTime.now().minus(NEW_PRODUCT_REFERENCE_TIME, ChronoUnit.WEEKS));
private Predicate getHavingCondition(Long lastIdx, Long lastItemId, ItemSortType sortType) {
        return switch (sortType) {
            case NEW -> item.itemId.lt(lastIdx);
            case HIGHEST_AMOUNT -> item.price.lt(lastIdx)
                .or(item.price.eq(lastIdx.intValue()).and(item.itemId.gt(lastItemId)));
            case LOWEST_AMOUNT -> item.price.gt(lastIdx)
                .or(item.price.eq(lastIdx.intValue()).and(item.itemId.gt(lastItemId)));
            case DISCOUNT -> item.discount.lt(lastIdx)
                .or(item.discount.eq(lastIdx.intValue()).and(item.itemId.gt(lastItemId)));
            default -> JPAExpressions.select(orderItem.quantity.longValue().sum().coalesce(0L))
                .from(orderItem)
                .where(orderItem.item.eq(item))
                .lt(lastIdx);
        };
    }
함수설명
ltless than
gtgreater than
or
eq
and
any
sum

GROUP BY

  1. 그룹화된 결과에 집계 함수를 적용하기 위해 사용된다.
  • 집계 필드의 조건
    1. SELECT 목록에 포함되어 있어야 한다.
    2. 각 그룹에 대해 하나의 결과를 생성해야 한다.
    3. id 필드는 대부분 허용된다.
  • 집계 필드로 사용 될 수 없는 경우
    1. 그룹화된 결과에 대해 명확한 대표값을 제공하지 않는 필드

ONLY_FULL_GROUP_BY 모드 : MySQL의 ONLY_FULL_GROUP_BY 모드가 해제되어 있는 경우에는 GROUP BY 절에 있는 필드가 SELECT 목록에 포함되어 있지 않아도 쿼리를 실행할 수 있습니다.

profile
devlog

0개의 댓글