본문 바로가기
Spring

[querydsl] 하나의 entity를 여러번 join하고 싶을 때

by 루에 2022. 8. 1.
반응형

QClass로 querydsl을 작성하다가 하나의 entity(테이블)을 여러번 join하는 등, n번 사용하고 싶을 때가 있다.

그럴 때, QClass에는 생성 시 variable을 지정해서 사용해야 한다.

 

아래처럼 서로 다른 이름을 지정한다.

QPpApl ppApl = new QPpApl("ppApl");
QPpApl ppApl2 = new QPpApl("ppApl2");
QUsr usr = new QUsr("usr");
QUsr usr2 = new QUsr("usr2");

 

그런데! 주의사항이 있다. 같은 entity간 중요한 것이 아니다. query를 작성하는 모든 곳에서 유일한 값이어야 한다.

즉, 저 4개의 QClass에서 서로 겹치는게 발생하면 query 수행 시 문제가 발생할 수 있다.

 

아래처럼 바꿔보자. ppApl과 usr는 서로 다른 entity지만 같은 이름을 갖게 되었다.

QPpApl ppApl = new QPpApl("ppApl");
QPpApl ppApl2 = new QPpApl("ppApl2");
QUsr usr = new QUsr("ppApl");
QUsr usr2 = new QUsr("usr2");

그리고 실행하면 아래와 같은 에러가 발생한다.(QClass 참조가 꼬여 값을 찾을 수 없다)

Caused by: org.hibernate.QueryException: could not resolve property: loginNm of: com.PpApl [select ppBas.ppId, ppBas.ppNm, ppBas.ppDvCd, ppBas.ppStCd, ppBas.salesChnlCd, ppBas.expPri, ppBas.expStaDtm, ppBas.expEndDtm, ppBas.usfeeAmt, ppBas.dcAmt, ppBas.dcRt, ppApl.loginNm as frstRegUsrId, ppApl.pnm as frstRegUsrNm, ppBas.frstRegDtm, usr2.loginNm as lastModUsrId, usr2.pnm as lastModUsrNm, ppBas.lastModDtm
from com.PpBas ppBas
  left join com.PpApl ppApl with ppBas.aplPpAplId = ppApl.ppAplId
  left join com.PpApl ppApl2 with ppApl.aplUsrId = ppApl.usrId and ppBas.lastChgPpAplId = ppApl2.ppAplId
  left join com.Usr usr2 with ppApl2.aplUsrId = usr2.usrId]
	at org.hibernate.QueryException.generateQueryException(QueryException.java:120)
	at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103)
Caused by: org.hibernate.QueryException: could not resolve property: loginNm of: com.PpApl

 

반응형

댓글