본문 바로가기

Spring/Spring Data JPA

QueryDsl Projection.bean Object로 조회 결과 받기

DTO(Entity)를 처음 인자로 넣어 주고 Object와 mapping 되는 columl의 인자 값을 셋팅 한다.

create a Bean populating projection for the given type and expressions 
Example 

UserDTO dto = query.select( 
	Projections.bean(UserDTO.class, user.firstName, user.lastName)); 
       

 

@Embeddable  / @EmbeddedId 로 멀티PK가 잡힌 경우엔

Projection.bean 사용시, alias 기능을 이용하여 Mapping 시켜 준다. 

 

QAdGroupEntity qAdGroupEntity = QAdGroupEntity.adGroupEntity;
    List<AdGroupEntity> adGroupEntities = jpaQueryFactory
        .select(
            Projections.bean(AdGroupEntity.class,
                qAdGroupEntity.startTime.coalesce(new Date()).as("startTime"),
                qAdGroupEntity.endTime.coalesce(new Date()).as("endTime"),
                Projections.bean(qAdGroupEntity.adGroupEntityPK, qAdGroupEntity.adGroupEntityPK.campaignId,qAdGroupEntity.adGroupEntityPK.adGroupId,qAdGroupEntity.adGroupEntityPK.mediaId).as("adGroupEntityPK")
                )
            )
        .from(QAdGroupEntity.adGroupEntity)
        .where(QAdGroupEntity.adGroupEntity.adGroupEntityPK.campaignId.in(streamSupplierCampaignId.get().distinct().collect(Collectors.toList())))
        .fetch();

 

fetchJoin 을 사용하여 Join된 모든 필드를 조회 한다. 

중간에 fetchJoin을 해주지 않으면 조인 필드가 최종 검색 결과에 포함되지 않는다.

List<Tuple> tupleList = getJpaQuery().select(qRRequestInformationEntity, qRCampaignInfoEntity).from(qRRequestInformationEntity)
        .join(qRCampaignInfoEntity)
        .on(qRRequestInformationEntity.reportNumber.eq(qRCampaignInfoEntity.reportCampaignInfoPK.reportNumber))
        .fetchJoin()
        .where(qRCampaignInfoEntity.reportCampaignInfoPK.campaignId.eq(streamSupplierCampaignId.get().distinct().collect(Collectors.joining())))
        .fetch();