[QueryDSL] 프로젝션과 결과의 반환

프로젝션이란

  • 쿼리에서 특정 필드를 선택하는 과정
  • 원하는 데이터만 추출해서 성능 최적화 및 데이터의 가공을 용이하게 함.

프로젝션 사용법

  1. 단일 필드 프로젝션
    1. 단일 컬럼을 선택시, 해당 타입으로 결과를 반환한다.
    1. 예제
      @Test
          public void selectSingleProjection() {
              List<String> fetch = qf.selectFrom(item)
                                     .select(item.name)
                                     .fetch();
              System.out.println("fetch = " + fetch);
          }
      
      fetch = [item0, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15, item16, item17, item18, item19]
  1. 다중 필드 프로젝션 앤드 튜플~
    1. 여러 필드 선택시 Tuple 타입을 사용함
    @Test
        public void selectMultipleProjection() {
            List<Tuple> fetch = qf.selectFrom(item)
                                  .select(item.name, item.price)
                                  .fetch();
            System.out.println("fetch = " + fetch);
        }
    
    fetch = [[item0, 0], [item1, 1000], [item2, 2000], [item3, 3000], [item4, 4000], [item5, 5000], [item6, 6000], [item7, 7000], [item8, 8000], [item9, 9000], [item10, 10000], [item11, 11000], [item12, 12000], [item13, 13000], [item14, 14000], [item15, 15000], [item16, 16000], [item17, 17000], [item18, 18000], [item19, 19000]]
  1. 빈 생성(Bean Population)
    • 쿼리의 결과를 특정 객체로 받으려면 빈 생성 기능을 사용함
    1. 프로퍼티 접근
      @Test
          public void selectBeanPopulation() {
              List<ItemDto> fetch = qf.selectFrom(item)
                                      .select(
                                          bean(ItemDto.class, item.name.as("username"), item.price)
                                      )
                                      .fetch();
              System.out.println("fetch = " + fetch);
          }
      • 전통적인 DTO 는 사용가능했지만, 자바 17의 Record 는 사용이 힘들었습니다.
      • 레코드는 생성자로 접근해야합니다.
    1. 필드 직접 접근
      QItem item = QItem.item;
      List<ItemDTO> result = query.from(item).list(
      Projections.fields (ItemDTO.class, item.name.as("username"),
      item.price));
    1. 생성자를 사용
      @Test
          void selectConstructor() {
              List<ItemDto1> fetch = qf.selectFrom(item)
                                      .select(
                                          constructor(ItemDto1.class, item.name, item.price)
                                      )
                                      .fetch();
              System.out.println("fetch = " + fetch);
          }
  • distinct
    • qf.distinct().selectFrom(…


Uploaded by N2T