members = memberRepository.findAll(); // Then for (Member member : members) { System.out.println("member = " + member.getUsername()); System.out.println("member's team = " + member.getTeam().getName()); } }"> members = memberRepository.findAll(); // Then for (Member member : members) { System.out.println("member = " + member.getUsername()); System.out.println("member's team = " + member.getTeam().getName()); } }"> members = memberRepository.findAll(); // Then for (Member member : members) { System.out.println("member = " + member.getUsername()); System.out.println("member's team = " + member.getTeam().getName()); } }">
@Test
public void findMemberLazy() {
// Given
Team teamA = new Team("teamA");
Team teamB = new Team("teamB");
teamRepository.save(teamA);
teamRepository.save(teamB);
memberRepository.save(new Member("member1", 10, teamA));
memberRepository.save(new Member("member2", 20, teamB));
em.flush();
em.clear();
// When
List<Member> members = memberRepository.findAll();
// Then
for (Member member : members) {
System.out.println("member = " + member.getUsername());
System.out.println("member's team = " + member.getTeam().getName());
}
}
fetch 조인으로 해결이 가능하다.
@Query("select m from Member m left join fetch m.team")
List<Member> findMemberWithTeam();
그렇다면 항상 @Query를 써야 쓸 수 있나? 아니다. @EntityGraph를 사용하면 된다.
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
<aside> 💡 기본적으로 left join이 되는데? 바꿀 수 있나?
</aside>
@Override
@EntityGraph(attributePaths = {"team"})
List<Member> findAll();
@EntityGraph(attributePaths = {"team"})
@Query("select m from Member m")
List<Member> findMemberEntityGraph();
@EntityGraph(attributePaths = {"team"})
List<Member> findByUsername(@Param("username") String username);