반응형
여승철
INTP 개발자
여승철
  • 분류 전체보기 (376)
    • CS (16)
      • 면접 준비 (7)
      • 운영체제 (0)
      • 네트워크 (2)
      • HTTP (6)
      • 스프링(Spring) IoC 컨테이너 (0)
      • 알고리즘 (1)
    • Web (13)
    • AWS (6)
    • Java (43)
    • JSP & Servlet (65)
      • 개념 (42)
      • 실습 (23)
    • Spring Framework (33)
    • Spring Boot (10)
    • Spring Data (22)
      • JPA (14)
      • Query DSL (7)
      • Redis (1)
    • Spring Security (9)
    • Spring Batch (4)
    • MyBatis (10)
    • Front-End (51)
      • JS (27)
      • Vue.js (17)
      • React (5)
      • JQuery (0)
      • d3.js (2)
    • DBMS (24)
      • SQL, RDBMS (16)
      • MongoDB (5)
      • Redis (3)
    • Kafka (3)
    • 리눅스 (Linux) (4)
    • 디자인 패턴 (3)
    • VCS (8)
    • API (0)
    • TOOL (3)
    • Reading Book (28)
      • 이펙티브 자바 (11)
      • Clean Code (10)
      • 1분 설명력 (4)
      • HOW TO 맥킨지 문제해결의 기술 (3)
    • C# (4)
    • NSIS (6)
    • ETC (11)

블로그 메뉴

  • 홈
  • 태그

인기 글

태그

  • Spring Batch
  • controller
  • 스트림
  • 디자인 패턴
  • querydsl
  • jsp
  • 이펙티브 자바
  • ubuntu
  • JSTL
  • HTTP
  • 환경 세팅
  • 로그인
  • EC2
  • 게시판
  • 맥킨지
  • 회원 관리
  • Dao
  • servlet
  • JDBC
  • mybatis

최근 댓글

최근 글

hELLO· Designed By 정상우.
여승철

INTP 개발자

QueryDSL DTO에 값 담기
Spring Data/Query DSL

QueryDSL DTO에 값 담기

2023. 1. 15. 22:45
반응형

DTO에 값 담는 방법

  1. 프로퍼티 접근 (setter 사용)
  2. 필드 접근
  3. 생성자 이용
  4. @QueryProjection 어노테이션

 

1.  프로퍼티 접근

    List<MemberDto> result = jpaQueryFactory
            .select(Projections.bean(MemberDto.class,
                    member.username,
                    member.age))
            .from(member)
            .fetch();
  • Projection.bean ( Class, {field, ... } )
    • 이 메소드를 사용하면 기본 생성자와 setter를 통해서 객체를 만듭니다.
    • 때문에 DTO에 setter, getter를 설정해주어야 합니다.

 

 

2. 필드 접근

    List<MemberDto> result = jpaQueryFactory
            .select(Projections.fields(MemberDto.class,
                    member.username,
                    member.age))
            .from(member)
            .fetch();
  • Projection.fields ( Class, {field, ... }  )
    • 프로퍼티 접근이 아닌 필드에 바로 주입하기 때문에 DTO가 getter, setter를 갖고 있지 않아도 됩니다.
  • QMember.member와 MemberDto.class의 필드 이름이 매칭되어야 할기 때문에 이름이 같아야 합니다.
    • 필드 이름이 다른 경우 아래 예시 처럼 별칭을 주면 됩니다. 아래 예시는 Dto명도 UserDto로 지어주었습니다.
    List<UserDto> result = jpaQueryFactory
            .select(Projections.fields(UserDto.class,
                    member.username.as("name"),
                    ExpressionUtils.as(
                            JPAExpressions
                            .select(memberSub.age.max())
                            .from(memberSub), "age"
                    )))
            .from(member)
            .fetch();
  • 필드명.as( alias ) : 필드에 별칭 적용
  • ExpressionUtils.as( source, alias ) : 필드 혹은 서브 쿼리에 별칭 적용

 

3. 생성자 이용

    List<MemberDto> result = jpaQueryFactory
            .select(Projections.constructor(MemberDto.class,
                    member.username,
                    member.age))
            .from(member)
            .fetch();

 

 

4. @QueryProjection

  • DTO 생성자에 @QueryProjection을 붙여준 다음 컴파일하여 DTO도 Entity 클래스와 마찬가지로 Q타입의 클래스를 생성해줍니다.
  • 이 방법은 DTO가 Query DSL에 의존하게 합니다.
@Data
@NoArgsConstructor
public class MemberDto {
    private String username;
    private Long age;

    @QueryProjection
    public MemberDto(String username, Long age) {
        this.username = username;
        this.age = age;
    }
}
  • gradle > tasks > other > compileQuerydsl 실행하면 QMemberDTO 생성됩니다.

 

    List<MemberDto> result = queryFactory
            .select(new QMemberDto(member.username, member.age))
            .from(member)
            .fetch();
반응형

'Spring Data > Query DSL' 카테고리의 다른 글

QueryDSL Spring Data JPA + 동적 쿼리  (0) 2023.01.18
QueryDSL 벌크 쿼리  (0) 2023.01.16
QueryDSL 동적 쿼리  (0) 2023.01.16
QueryDSL 문법  (0) 2023.01.15
QueryDSL Spring Data JPA 같이 적용하기  (0) 2023.01.14
    여승철
    여승철

    티스토리툴바