그루핑
@Test
public void selectGroup() {
List<Item> items = qf.selectFrom(item)
.groupBy(item.price, item.id)
.having(item.price.gt(1000))
.fetch();
System.out.println("items = " + items);
}
items = [Item(id=3, name=item2, price=2000, stockQuantity=2), Item(id=4, name=item3, price=3000, stockQuantity=3), Item(id=5, name=item4, price=4000, stockQuantity=4), Item(id=6, name=item5, price=5000, stockQuantity=5), Item(id=7, name=item6, price=6000, stockQuantity=6), ...
- group by 를 사용하여 그룹화된 결과 제한시
having
사용
조인
- 기본 조인 사용
- 조인문법
- join, leftjoin, rightJoin, fullJoin
- 등의 메서드를 사용함
- 조인문법
- 예제
@BeforeEach public void beforeEach() { qf = new JPAQueryFactory(em); List<Item> items = new ArrayList<>(); OrderItem orderItem = OrderItem.builder() .orderPrice(1000) .count(1) .build(); Member member = new Member("상준", null); em.persist(member); Order order = new Order(); order.addItem(orderItem); order.addMember(member); for (int i = 0; i < 50; i++) { items.add(new Item("item" + i, i * 1000, i)); } orderRepository.save(order); itemRepository.saveAll(items); } @Test public void selectLeftJoin() { List<Order> orders = qf.selectFrom(order) .join(order.member) .leftJoin(order.orderItems) .fetch(); System.out.println("orders = " + orders); System.out.println("orders.get(0).getOrderItems() = " + orders.get(0) .getOrderItems()); }
on
절을 사용한 조인@Test public void selectLeftJoinOn() { List<Order> orders = qf.selectFrom(order) .leftJoin(order.orderItems, orderItem) .on(orderItem.count.gt(2)) .fetch(); System.out.println("orders = " + orders); }
select o1_0.id,o1_0.member_id from orders o1_0 left join orders_item o2_0 on o1_0.id=o2_0.order_id and o2_0.count>2;
- 페치 조인
- 연관된 엔티티나 컬렉션을 SQL 로 한번에 조회함.
- LAZY 로딩을 별도로 타지 않음.
@Test public void selectFetchJoin() { List<Order> orders = qf.selectFrom(order) .join(order.member, member) .fetchJoin() .leftJoin(order.orderItems, orderItem) .fetchJoin() .fetch(); }
- 세타 조인
from
절에 여러 조인을 사용하는 전략
- 두 테이블 간의 관계를 정의하지 않고도 조인이 가능하다.
성능에 주의해야함.
@Test public void selectThetaJoin() { List<Order> orders = qf.selectFrom(order) .where(order.member.name.eq("상준")) .fetch(); System.out.println("orders = " + orders); System.out.println("orders = " + orders.get(0) .getMember()); }
- 조인을 하긴하는데
- 솔직히 겁나게 위험해 보인다.
- name 값이 고유값이면 상관없어 보이긴하는데
- 그게 아니라면 모든 데이터를 다 끌어올것이다.
Uploaded by N2T
'자바 > QueryDsl' 카테고리의 다른 글
[DataJpa] 데이터 JPA 공통 인터페이스 (0) | 2023.11.15 |
---|---|
[DataJpa] 쿼리 메서드 기능 (0) | 2023.11.15 |
[DataJpa] Named Query (0) | 2023.11.15 |
[DataJpa] Named Query (0) | 2023.11.15 |
[QueryDSL] 페이징과 정렬 (0) | 2023.11.15 |