Develop/spring-data

[Querydsl-JPA] Querydsl JPA를 사용하며.. "*" 아스타리스크 사용방법

에디개발자 2020. 12. 20. 07:00
반응형

개발할 때 테이블의 모든 컬럼을 조회할 경우가 있습니다. 그때 Querydsl-JPA를 사용할 때 어떻게 사용할 수 있는지 작성해보겠습니다.

모든 소스는 github에 올려두었습니다.

나를 닮았다고 한다...

먼저 하고 싶은 쿼리가 어떤 것인지 작성해보겠습니다.

select
    s.*
    , etc_option
  from staff s
      join store st on s.store_id = st.id
 where s.name = 'staffV'
 limit 1

 

이것과 동일한 Querydsl을 작성해보겠습니다.

먼저 Vo를 생성합니다.

@Getter @Setter @ToString
public class StaffEtcVo {

    private Staff staff;
    private String address;
}

필드에 Staff Entity를 선언합니다

 

다음으로 Querydsl-JPA를 작성합니다.

@Override
public StaffEtcVo findStaffAndEtcOption(String name) {
    return jpaQueryFactory
            .select(Projections.fields(StaffEtcVo.class,
                    staff,
                    store.address
                    ))
            .from(staff)
                .join(store)
                    .on(store.id.eq(staff.storeId))
            .where(staff.name.eq(name))
            .fetchFirst();
}

그럼 아래와 같은 쿼리를 생성할 것입니다. 

select
        staff0_.id as col_0_0_,
        store1_.address as col_1_0_,
        staff0_.id as id1_0_,
        staff0_.age as age2_0_,
        staff0_.last_name as last_nam3_0_,
        staff0_.name as name4_0_,
        staff0_.store_id as store_id5_0_ 
    from
        staff staff0_ 
    inner join
        store store1_ 
            on (
                store1_.id=staff0_.store_id
            ) 
    where
        staff0_.name='staffN' limit 1

확인해보시면 모든 Staff의 필드를 조회하는 것을 확인할 수 있습니다.

 

Tip

만약 Vo객체에서 staffEtcVo.getStaff().getId() 가 불필요하고 바로 staffEtcVo.getId()를 하고 싶다면 @JsonUnwrapped 붙혀줍니다. Unwrapped를 시켜줍니다!

@Getter @Setter @ToString
public class StaffEtcVo {

    @JsonUnwrapped
    private Staff staff;
    private String address;
}

단! API의 Response값으로 적용되기 때문에 바로 조회 후는 불가능합니다!

반응형