Spring Boot JPA에서 join하려는데 join 대상 테이블에 데이터가 없어도 들고와야하는 경우

이혜지·2023년 4월 27일
0
post-custom-banner

1. 문제


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가 없어도 그냥 들고오고 싶은데 어떻게 바꾸면 좋을까

ㅇ우리 테이블은 MissionLogMissionAttachment 를 가지고 있는게 아니라,

MissionAttachment 에서 MissionLog 를 단방향으로 mission_log_id 를 외래키로 들고 있다.

그래서 만약 해당 일자에 진행한 미션에 첨부파일이 있으면 MissionAttachment 에 data가 insert되고, 해당 일자에 진행한 미션에 첨부파일이 없다면 MissionAttachment 에 data가 insert 되지 않는다.

그래서 만약 그냥 join으로 들고온다면

해당 쿼리는 MissionAttachment 테이블을 join 하고 있으므로, MissionAttachment 테이블에 데이터가 없으면 NoResultException 예외가 발생.

2. 해결


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();
profile
공유 문화를 지향하는 개발자입니다.
post-custom-banner

0개의 댓글