spring data jpa : @EntityGraph
This commit is contained in:
@@ -12,6 +12,7 @@ import javax.persistence.*;
|
||||
name="Member.findByUsername",
|
||||
query="select m from Member m where m.username = :username"
|
||||
)
|
||||
@NamedEntityGraph(name = "Member.all", attributeNodes = @NamedAttributeNode("team"))
|
||||
public class Member {
|
||||
|
||||
@Id @GeneratedValue
|
||||
|
||||
@@ -5,6 +5,7 @@ import com.example.springdatajpa.entity.Member;
|
||||
import org.springframework.data.domain.Page;
|
||||
import org.springframework.data.domain.Pageable;
|
||||
import org.springframework.data.domain.Slice;
|
||||
import org.springframework.data.jpa.repository.EntityGraph;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Modifying;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
@@ -47,4 +48,19 @@ public interface MemberRepository extends JpaRepository<Member, Long> {
|
||||
@Modifying
|
||||
@Query("update Member m set m.age = m.age + 1 where m.age >= :age")
|
||||
int bulkAgePlus(@Param("age") int age);
|
||||
|
||||
@Query("select m from Member m left join fetch m.team")
|
||||
List<Member> findMemberFetchJoin();
|
||||
|
||||
@Override
|
||||
// @EntityGraph(attributePaths = {"team"})
|
||||
List<Member> findAll();
|
||||
|
||||
@EntityGraph(attributePaths = {"team"})
|
||||
@Query("select m from Member m")
|
||||
List<Member> findMemberEntityGraph();
|
||||
|
||||
// @EntityGraph(attributePaths = {"team"})
|
||||
@EntityGraph("Member.all")
|
||||
List<Member> findEntityGraphByUsername(@Param("username") String username);
|
||||
}
|
||||
|
||||
@@ -243,5 +243,41 @@ public class MemberRepositoryTest {
|
||||
// then
|
||||
assertEquals(3, resultCount);
|
||||
}
|
||||
|
||||
@Test
|
||||
void findMemberLazy() {
|
||||
// given
|
||||
// member1 -> teamA
|
||||
// member2 -> teamB
|
||||
|
||||
Team teamA = new Team("teamA");
|
||||
Team teamB = new Team("teamB");
|
||||
teamRepository.save(teamA);
|
||||
teamRepository.save(teamB);
|
||||
Member member1 = new Member("member1", 10, teamA);
|
||||
Member member2 = new Member("member2", 10, teamB);
|
||||
memberRepository.save(member1);
|
||||
memberRepository.save(member2);
|
||||
|
||||
em.flush();
|
||||
em.clear();
|
||||
|
||||
// when
|
||||
List<Member> members = memberRepository.findAll();
|
||||
members.forEach(member -> {
|
||||
System.out.println("member.getUsername() = " + member.getUsername());
|
||||
System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass()); // Lazy 로딩 이므로 프록시 객체
|
||||
System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); // 이때 실제로 team 데이터 조회 ( N + 1 문제 발생 )
|
||||
});
|
||||
|
||||
// fetch join 으로 해결 -> 한 번에 team 데이터도 모두 조회
|
||||
// @EntityGraph(attributePaths = {"team"}) 사용 가능
|
||||
List<Member> memberFetchJoin = memberRepository.findMemberFetchJoin();
|
||||
memberFetchJoin.forEach(member -> {
|
||||
System.out.println("member.getUsername() = " + member.getUsername());
|
||||
System.out.println("member.getTeam().getClass() = " + member.getTeam().getClass());
|
||||
System.out.println("member.getTeam().getName() = " + member.getTeam().getName()); // fetch join
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user