티스토리 뷰

Skill/spring

JPA JOIN 처리

진열사랑 2025. 7. 18. 15:29

QBizInfo.dcrpPpl.rgtr가 사용자 ID라면, 이 값과 사용자 테이블(User)의 PK 또는 FK를 매핑해서 조인할 수 있습니다. 아래 예시는 사용자 테이블과 조인하여, 예를 들어 user.name 또는 user.dept 등의 컬럼도 함께 가져오는 방식입니다.


✅ 전제 조건

사용자 테이블이 User이고, QueryDSL Q타입은 QUser user = QUser.user라고 가정하겠습니다.
QBizInfo.dcrpPpl.rgtr 값은 user.userId와 매핑된다고 가정합니다.


✅ 변경된 코드 (User 테이블 조인 포함)

public class BizInfoRepositoryImpl implements BizInfoRepositoryCustom {

    private final JPAQueryFactory jpaQueryFactory;

    public BizInfoRepositoryImpl(JPAQueryFactory jpaQueryFactory) {
        this.jpaQueryFactory = jpaQueryFactory;
    }

    @Override
    public Page<BizInfoResponseDto> findPage(BizInfoSearchDto dcrpPplDto, Pageable pageable) {
        QBizInfo dcrpPpl = QBizInfo.dcrpPpl;
        QUser user = QUser.user; // 사용자 Q타입

        JPQLQuery<BizInfoResponseDto> query = jpaQueryFactory
                .select(Projections.fields(
                        BizInfoResponseDto.class,
                        dcrpPpl.dcrpPplMtncBizSn,
                        dcrpPpl.mngYr,
                        dcrpPpl.mngQu,
                        dcrpPpl.atflCd,
                        dcrpPpl.atflId,
                        dcrpPpl.dcrpPplMtncBizNm,
                        dcrpPpl.regDt,
                        dcrpPpl.rgtr.as("rgtr"),
                        user.name.as("rgtrName") // 예시: 사용자 이름도 반환
                ))
                .from(dcrpPpl)
                .leftJoin(user).on(dcrpPpl.rgtr.eq(user.userId)) // 사용자 조인
                .where(
                        StringUtil.isEmpty(dcrpPplDto.getFromMngYr()) ? null : dcrpPpl.mngYr.goe(dcrpPplDto.getFromMngYr()),
                        StringUtil.isEmpty(dcrpPplDto.getToMngYr()) ? null : dcrpPpl.mngYr.loe(dcrpPplDto.getToMngYr()),
                        StringUtil.isEmpty(dcrpPplDto.getFromRegDt()) ? null : dcrpPpl.regDt.goe(DateUtil.getLocalDateTime(dcrpPplDto.getFromRegDt())),
                        StringUtil.isEmpty(dcrpPplDto.getToRegDt()) ? null : dcrpPpl.regDt.loe(DateUtil.getLocalDateTimeEndOfDay(dcrpPplDto.getToRegDt())),
                        StringUtil.isEmpty(dcrpPplDto.getBizInfoMtncBizNm()) ? null : dcrpPpl.dcrpPplMtncBizNm.contains(dcrpPplDto.getBizInfoMtncBizNm())
                );

        PageUtil.applySort(query, pageable.getSort(), dcrpPpl);

        return PageUtil.fetchPage(query, pageable);
    }
}

✅ DTO에 필드 추가

public class BizInfoResponseDto {
    private String dcrpPplMtncBizSn;
    private String mngYr;
    private String mngQu;
    private String atflCd;
    private String atflId;
    private String dcrpPplMtncBizNm;
    private LocalDateTime regDt;
    private String rgtr;
    private String rgtrName; // ← 사용자 이름 등 추가 필드
}

📌 주의

  • leftJoin 대신 join을 쓰면 inner join이 됩니다.
  • user.name 대신 다른 컬럼 (user.deptName, user.email 등)을 조인해서 가져와도 됩니다.
  • Projections.fields() 방식에서는 DTO 필드명과 .as() 별칭이 반드시 일치해야 합니다.

필요하다면 join fetch, @EntityGraph, Projections.constructor 방식도 추가로 설명드릴 수 있습니다.

'Skill > spring' 카테고리의 다른 글

PostgreSQL] 최대 동시 접속자 수를 초과  (0) 2025.07.18
A TupleBackedMap cannot be modified.  (1) 2025.07.18
JPA + multipart 등록  (2) 2025.07.16
JPA] Hibernate와 Spring Data R2DBC  (1) 2025.07.15
@ReactiveFeignClient과 @FeignClient  (2) 2025.07.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함