em.createQuery(
"select new com.ssafy.a802.jaljara.api.dto.response.MissionLogRequestDto"
+ "(ml.id, ml.user.id, ml.isSuccess, ml.missionDate, ma.missionType, ml.content, ma.url)"
+ " from MissionLog ml"
+ " join MissionAttachment ma"
+ " on ml.id = ma.missionLog.id"
+ " where ml.user.id =:userId"
+ " and ml.missionDate =:missionDate", MissionLogRequestDto.class)
.setParameter("userId", userId)
.setParameter("missionDate", missionDate)
.getSingleResult();
여기서 join할 MissionAttachment가 없어도 그냥 들고오고 싶은데 어떻게 바꾸면 좋을까
ㅇ우리 테이블은 MissionLog
가 MissionAttachment
를 가지고 있는게 아니라,
MissionAttachment
에서 MissionLog
를 단방향으로 mission_log_id
를 외래키로 들고 있다.
그래서 만약 해당 일자에 진행한 미션에 첨부파일이 있으면 MissionAttachment
에 data가 insert되고, 해당 일자에 진행한 미션에 첨부파일이 없다면 MissionAttachment
에 data가 insert 되지 않는다.
그래서 만약 그냥 join으로 들고온다면
해당 쿼리는 MissionAttachment
테이블을 join
하고 있으므로, MissionAttachment
테이블에 데이터가 없으면 NoResultException
예외가 발생.
fetch join으로 들고오면 되지요~
return em.createQuery(
"select new com.ssafy.a802.jaljara.api.dto.response.MissionLogRequestDto"
+ "(ml.id, ml.user.id, ml.isSuccess, ml.missionDate, ma.missionType, ml.content, ma.url)"
+ " from MissionLog ml"
+ " left join MissionAttachment ma"
+ " on ml.id = ma.missionLog.id"
+ " where ml.user.id =:userId"
+ " and ml.missionDate =:missionDate", MissionLogRequestDto.class)
.setParameter("userId", userId)
.setParameter("missionDate", missionDate)
.getSingleResult();