Backend/Spring

QueryDSL(2)

brian110326 2024. 4. 12. 22:17

이 글은  QueryDSL의 2가지 방법 중 2번째 방법이다. 사용자 정의 인터페이스 설계 후 QueryDslRepositorySupport 상속받는 것이다.

 

1. pom.xml에 querydsl dependency  추가(이전 글 참고)

 

2. 사용자 정의 인터페이스 설계

package com.example.mart.repository;

import com.example.mart.entity.Item;
import com.example.mart.entity.Member;
import java.util.List;

public interface QueryDslOrderRepository {
  public List<Object[]> joinList();

  public List<Member> members();

  public List<Item> items();
}

 

3. 사용자 정의 인터페이스를 구현하는 클래스 작성

package com.example.mart.repository;

import com.example.mart.entity.Item;
import com.example.mart.entity.Member;
import com.example.mart.entity.Order;
import com.example.mart.entity.QItem;
import com.example.mart.entity.QMember;
import com.example.mart.entity.QOrder;
import com.example.mart.entity.QOrderItem;
import com.querydsl.core.Tuple;
import com.querydsl.jpa.JPQLQuery;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;

public class QueryDslOrderRepositoryImpl
  extends QuerydslRepositorySupport
  implements QueryDslOrderRepository {

  public QueryDslOrderRepositoryImpl() {
    super(Order.class);
  }

  @Override
  public List<Object[]> joinList() {
    QMember member = QMember.member;
    QOrder order = QOrder.order;
    QOrderItem orderItem = QOrderItem.orderItem;

    JPQLQuery<Order> query = from(order);
    query.join(order.member, member).leftJoin(order.orderItems, orderItem);

    JPQLQuery<Tuple> tuple = query.select(member, order, orderItem);
    List<Tuple> result = tuple.fetch();

    List<Object[]> list = result
      .stream()
      .map(t -> t.toArray())
      .collect(Collectors.toList());
    return list;
  }

  @Override
  public List<Member> members() {
    // select * from member where name = 'user1' order by name desc
    QMember member = QMember.member;
    JPQLQuery<Member> query = from(member);
    query.where(member.name.eq("user1")).orderBy(member.name.desc());

    JPQLQuery<Member> tuple = query.select(member);
    List<Member> list = tuple.fetch();

    return list;
  }

  @Override
  public List<Item> items() {
    // select * from item where name='바지' and price>20000
    QItem item = QItem.item;
    JPQLQuery<Item> query = from(item);
    query.where(item.name.eq("바지").and(item.price.gt(20000)));

    JPQLQuery<Item> tuple = query.select(item);
    List<Item> list = tuple.fetch();

    return list;
  }
}

'Backend > Spring' 카테고리의 다른 글

실수하는 것들, 주의할점들  (0) 2024.04.16
Pageable 객체  (0) 2024.04.12
QueryDSL(1)  (0) 2024.04.12
Native Sql  (0) 2024.04.12
JPQL  (0) 2024.04.11